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

Artifact ff00897172bad962c7f775f0a1daa19e2a3ed80a:


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 37  select.c,v 1.397
0200: 20 32 30 30 38 2f 30 31 2f 31 30 20 32 33 3a 35   2008/01/10 23:5
0210: 30 3a 31 31 20 64 72 68 20 45 78 70 20 24 0a 2a  0:11 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 69 6e 74 20 6e 45 78  pVdbe;.  int nEx
30a0: 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  pr = pOrderBy->n
30b0: 45 78 70 72 3b 0a 20 20 69 6e 74 20 72 65 67 42  Expr;.  int regB
30c0: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ase = sqlite3Get
30d0: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
30e0: 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20 69 6e  , nExpr+2);.  in
30f0: 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71  t regRecord = sq
3100: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
3110: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
3120: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
3130: 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
3140: 72 42 79 2c 20 72 65 67 42 61 73 65 29 3b 0a 20  rBy, regBase);. 
3150: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3160: 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
3170: 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  e, pOrderBy->iEC
3180: 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e  ursor, regBase+n
3190: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
31a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
31b0: 5f 4d 6f 76 65 2c 20 30 2c 20 72 65 67 42 61 73  _Move, 0, regBas
31c0: 65 2b 6e 45 78 70 72 2b 31 29 3b 0a 20 20 73 71  e+nExpr+1);.  sq
31d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
31e0: 76 2c 20 4f 50 5f 52 65 67 4d 61 6b 65 52 65 63  v, OP_RegMakeRec
31f0: 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72  , regBase, nExpr
3200: 20 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64 29   + 2, regRecord)
3210: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3220: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
3230: 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79 2d  nsert, pOrderBy-
3240: 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65  >iECursor, regRe
3250: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
3260: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
3270: 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
3280: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
3290: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
32a0: 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45  rse, regBase, nE
32b0: 78 70 72 2b 32 29 3b 0a 20 20 69 66 28 20 70 53  xpr+2);.  if( pS
32c0: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3e 3d 30  elect->iLimit>=0
32d0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
32e0: 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64  1, addr2;.    ad
32f0: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
3300: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
3310: 5a 65 72 6f 2c 20 70 53 65 6c 65 63 74 2d 3e 69  Zero, pSelect->i
3320: 4c 69 6d 69 74 2b 31 29 3b 0a 20 20 20 20 73 71  Limit+1);.    sq
3330: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3340: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 53  v, OP_AddImm, pS
3350: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 2b 31 2c  elect->iLimit+1,
3360: 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20   -1);.    addr2 
3370: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
3380: 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
3390: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
33a0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
33b0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
33c0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
33d0: 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e  Last, pOrderBy->
33e0: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  iECursor);.    s
33f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
3400: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70  (v, OP_Delete, p
3410: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
3420: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
3430: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
3440: 64 64 72 32 29 3b 0a 20 20 20 20 70 53 65 6c 65  ddr2);.    pSele
3450: 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b  ct->iLimit = -1;
3460: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
3470: 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d  d code to implem
3480: 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a  ent the OFFSET.*
3490: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
34a0: 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65  deOffset(.  Vdbe
34b0: 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a   *v,          /*
34c0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
34d0: 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20  nto this VM */. 
34e0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
34f0: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
3500: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
3510: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
3520: 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 2f 2a  iContinue,    /*
3530: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
3540: 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ip the current r
3550: 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
3560: 50 6f 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Pop          /* 
3570: 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  Number of times 
3580: 74 6f 20 70 6f 70 20 73 74 61 63 6b 20 77 68 65  to pop stack whe
3590: 6e 20 6a 75 6d 70 69 6e 67 20 2a 2f 0a 29 7b 0a  n jumping */.){.
35a0: 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74    if( p->iOffset
35b0: 3e 3d 30 20 26 26 20 69 43 6f 6e 74 69 6e 75 65  >=0 && iContinue
35c0: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  !=0 ){.    int a
35d0: 64 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ddr;.    sqlite3
35e0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
35f0: 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66  _AddImm, p->iOff
3600: 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64  set, -1);.    ad
3610: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
3620: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
3630: 65 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b  eg, p->iOffset);
3640: 0a 20 20 20 20 69 66 28 20 6e 50 6f 70 3e 30 20  .    if( nPop>0 
3650: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3660: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
3670: 5f 50 6f 70 2c 20 6e 50 6f 70 29 3b 0a 20 20 20  _Pop, nPop);.   
3680: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
3690: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
36a0: 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75  oto, 0, iContinu
36b0: 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  e);.    VdbeComm
36c0: 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 4f 46  ent((v, "skip OF
36d0: 46 53 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b  FSET records"));
36e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
36f0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
3700: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3710: 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69  Add code that wi
3720: 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ll check to make
3730: 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67 69   sure the N regi
3740: 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
3750: 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61  t iMem.** form a
3760: 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e   distinct entry.
3770: 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74    iTab is a sort
3780: 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68  ing index that h
3790: 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a  olds previously.
37a0: 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74  ** seen combinat
37b0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61  ions of the N va
37c0: 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74  lues.  A new ent
37d0: 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54  ry is made in iT
37e0: 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72  ab.** if the cur
37f0: 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72  rent N values ar
3800: 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  e new..**.** A j
3810: 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61  ump to addrRepea
3820: 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68  t is made and th
3830: 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65  e N+1 values are
3840: 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
3850: 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65  .** stack if the
3860: 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20   top N elements 
3870: 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74  are not distinct
3880: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3890: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20   codeDistinct(. 
38a0: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
38b0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
38c0: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
38d0: 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c  M */.  int iTab,
38e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
38f0: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65  orting index use
3900: 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69  d to test for di
3910: 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20  stinctness */.  
3920: 69 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20  int addrRepeat, 
3930: 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65     /* Jump to he
3940: 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e  re if not distin
3950: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  ct */.  int N,  
3960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3970: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
3980: 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20   */.  int iMem  
3990: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
39a0: 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  t element */.){.
39b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
39c0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 67 4d 61 6b  Op2(v, OP_RegMak
39d0: 65 52 65 63 2c 20 69 4d 65 6d 2c 20 4e 29 3b 0a  eRec, iMem, N);.
39e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
39f0: 4f 70 32 28 76 2c 20 4f 50 5f 44 69 73 74 69 6e  Op2(v, OP_Distin
3a00: 63 74 2c 20 69 54 61 62 2c 20 73 71 6c 69 74 65  ct, iTab, sqlite
3a10: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
3a20: 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c 69 74 65  (v)+3);.  sqlite
3a30: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3a40: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
3a50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3a60: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
3a70: 20 61 64 64 72 52 65 70 65 61 74 29 3b 0a 20 20   addrRepeat);.  
3a80: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
3a90: 22 73 6b 69 70 20 69 6e 64 69 73 74 69 6e 63 74  "skip indistinct
3aa0: 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 73   records"));.  s
3ab0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3ac0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
3ad0: 2c 20 69 54 61 62 2c 20 30 29 3b 0a 7d 0a 0a 2f  , iTab, 0);.}../
3ae0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
3af0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
3b00: 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20  hen a SELECT is 
3b10: 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 73 75  used within a su
3b20: 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28  bexpression.** (
3b30: 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20  example:  "a IN 
3b40: 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
3b50: 61 62 6c 65 29 22 29 20 62 75 74 20 69 74 20 68  able)") but it h
3b60: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72  as more than 1 r
3b70: 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e  esult.** column.
3b80: 20 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20    We do this in 
3b90: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63  a subroutine bec
3ba0: 61 75 73 65 20 74 68 65 20 65 72 72 6f 72 20 6f  ause the error o
3bb0: 63 63 75 72 73 20 69 6e 20 6d 75 6c 74 69 70 6c  ccurs in multipl
3bc0: 65 0a 2a 2a 20 70 6c 61 63 65 73 2e 0a 2a 2f 0a  e.** places..*/.
3bd0: 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
3be0: 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65  ForMultiColumnSe
3bf0: 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61 72  lectError(.  Par
3c00: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
3c10: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
3c20: 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  xt. */.  SelectD
3c30: 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a  est *pDest,   /*
3c40: 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20   Destination of 
3c50: 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a  SELECT results *
3c60: 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20 20  /.  int nExpr   
3c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3c80: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
3c90: 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
3ca0: 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20   SELECT */.){.  
3cb0: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
3cc0: 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28 20  t->eDest;.  if( 
3cd0: 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44 65 73  nExpr>1 && (eDes
3ce0: 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44  t==SRT_Mem || eD
3cf0: 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b  est==SRT_Set) ){
3d00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
3d10: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e  rMsg(pParse, "on
3d20: 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75  ly a single resu
3d30: 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22  lt allowed for "
3d40: 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43  .       "a SELEC
3d50: 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  T that is part o
3d60: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22  f an expression"
3d70: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
3d80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
3d90: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 0;.  }.}../
3da0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3db0: 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  e generates the 
3dc0: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73  code for the ins
3dd0: 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  ide of the inner
3de0: 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45   loop.** of a SE
3df0: 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  LECT..**.** If s
3e00: 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d  rcTab and nColum
3e10: 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c  n are both zero,
3e20: 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74   then the pEList
3e30: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
3e40: 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e  are evaluated in
3e50: 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
3e60: 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  e data for this 
3e70: 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e  row.  If nColumn
3e80: 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61 20  >0.** then data 
3e90: 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73  is pulled from s
3ea0: 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74  rcTab and pEList
3eb0: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f   is used only to
3ec0: 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61   get the.** data
3ed0: 74 79 70 65 73 20 66 6f 72 20 65 61 63 68 20 63  types for each c
3ee0: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  olumn..*/.static
3ef0: 20 69 6e 74 20 73 65 6c 65 63 74 49 6e 6e 65 72   int selectInner
3f00: 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Loop(.  Parse *p
3f10: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
3f20: 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
3f30: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
3f40: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
3f50: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65     /* The comple
3f60: 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  te select statem
3f70: 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ent being coded 
3f80: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
3f90: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  EList,       /* 
3fa0: 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62  List of values b
3fb0: 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a  eing extracted *
3fc0: 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20  /.  int srcTab, 
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3fe0: 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ull data from th
3ff0: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  is table */.  in
4000: 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t nColumn,      
4010: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4020: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
4030: 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a  e source table *
4040: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
4050: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49  rderBy,     /* I
4060: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74  f not NULL, sort
4070: 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74   results using t
4080: 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  his key */.  int
4090: 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20   distinct,      
40a0: 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20       /* If >=0, 
40b0: 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74  make sure result
40c0: 73 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a  s are distinct *
40d0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
40e0: 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48  pDest,      /* H
40f0: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
4100: 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
4110: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
4120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
4130: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
4140: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77  ue with next row
4150: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
4160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
4170: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
4180: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69  eak out of the i
4190: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63  nner loop */.  c
41a0: 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20  har *aff        
41b0: 20 20 20 20 20 20 20 2f 2a 20 61 66 66 69 6e 69         /* affini
41c0: 74 79 20 73 74 72 69 6e 67 20 69 66 20 65 44 65  ty string if eDe
41d0: 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 20  st is SRT_Union 
41e0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
41f0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
4200: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
4210: 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20  nt hasDistinct; 
4220: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
4230: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
4240: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
4250: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 3b  t */.  int iMem;
4260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4270: 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72  * Start of memor
4280: 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  y holding result
4290: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44   set */.  int eD
42a0: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
42b0: 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20  st;.  int iParm 
42c0: 3d 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 0a  = pDest->iParm;.
42d0: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
42e0: 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
42f0: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a  ( pEList!=0 );..
4300: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
4310: 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  s a LIMIT clause
4320: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
4330: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64  tatement, then d
4340: 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a  o the check.  **
4350: 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
4360: 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20 6f 75  row should be ou
4370: 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 68 61 73  tput..  */.  has
4380: 44 69 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69  Distinct = disti
4390: 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69 73 74  nct>=0 && pEList
43a0: 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20 20 69 66 28  ->nExpr>0;.  if(
43b0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20   pOrderBy==0 && 
43c0: 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  !hasDistinct ){.
43d0: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
43e0: 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  , p, iContinue, 
43f0: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75  0);.  }..  /* Pu
4400: 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ll the requested
4410: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20   columns..  */. 
4420: 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29   if( nColumn>0 )
4430: 7b 0a 20 20 20 20 6e 20 3d 20 6e 43 6f 6c 75 6d  {.    n = nColum
4440: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
4450: 6e 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  n = pEList->nExp
4460: 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65  r;.  }.  if( pDe
4470: 73 74 2d 3e 69 4d 65 6d 3e 30 20 29 7b 0a 20 20  st->iMem>0 ){.  
4480: 20 20 69 4d 65 6d 20 3d 20 70 44 65 73 74 2d 3e    iMem = pDest->
4490: 69 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iMem;.  }else{. 
44a0: 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d     pDest->iMem =
44b0: 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e   iMem = pParse->
44c0: 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
44d0: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 3b 0a 20  se->nMem += n;. 
44e0: 20 7d 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e   }.  if( nColumn
44f0: 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  >0 ){.    for(i=
4500: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
4510: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4520: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4530: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
4540: 2c 20 69 2c 20 69 4d 65 6d 2b 69 29 3b 0a 20 20  , i, iMem+i);.  
4550: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
4560: 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74  eDest!=SRT_Exist
4570: 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  s ){.    /* If t
4580: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
4590: 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29  s an EXISTS(...)
45a0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
45b0: 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76   actual.    ** v
45c0: 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 62  alues returned b
45d0: 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  y the SELECT are
45e0: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
45f0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
4600: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
4610: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
4620: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ode(pParse, pELi
4630: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
4640: 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20 7d 0a 20  iMem+i);.    }. 
4650: 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 6e   }.  nColumn = n
4660: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  ;..  /* If the D
4670: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
4680: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
4690: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
46a0: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
46b0: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
46c0: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
46d0: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
46e0: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
46f0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
4700: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73   */.  if( hasDis
4710: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
4720: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
4730: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
4740: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f  List->nExpr==nCo
4750: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65  lumn );.    code
4760: 44 69 73 74 69 6e 63 74 28 76 2c 20 64 69 73 74  Distinct(v, dist
4770: 69 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  inct, iContinue,
4780: 20 6e 43 6f 6c 75 6d 6e 2c 20 69 4d 65 6d 29 3b   nColumn, iMem);
4790: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
47a0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  y==0 ){.      co
47b0: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69  deOffset(v, p, i
47c0: 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d  Continue, nColum
47d0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  n);.    }.  }.. 
47e0: 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c   if( checkForMul
47f0: 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
4800: 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73  ror(pParse, pDes
4810: 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
4820: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
4830: 30 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  0;.  }..  switch
4840: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f  ( eDest ){.    /
4850: 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20  * In this mode, 
4860: 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79  write each query
4870: 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b   result to the k
4880: 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  ey of the tempor
4890: 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ary.    ** table
48a0: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23   iParm..    */.#
48b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
48c0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
48d0: 43 54 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  CT.    case SRT_
48e0: 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73  Union: {.      s
48f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4900: 28 76 2c 20 4f 50 5f 52 65 67 4d 61 6b 65 52 65  (v, OP_RegMakeRe
4910: 63 2c 20 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e  c, iMem, nColumn
4920: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 66 66  );.      if( aff
4930: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4940: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
4950: 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 34 5f 53  v, -1, aff, P4_S
4960: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a  TATIC);.      }.
4970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4980: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
4990: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
49a0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
49b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
49c0: 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72  onstruct a recor
49d0: 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79  d from the query
49e0: 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73   result, but ins
49f0: 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73  tead of.    ** s
4a00: 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72  aving that recor
4a10: 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b  d, use it as a k
4a20: 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65  ey to delete ele
4a30: 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a  ments from.    *
4a40: 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
4a50: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
4a60: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
4a70: 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20  _Except: {.     
4a80: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
4a90: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
4aa0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4ab0: 52 65 67 4d 61 6b 65 52 65 63 2c 20 69 4d 65 6d  RegMakeRec, iMem
4ac0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
4ad0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
4ae0: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 61 66 66  ngeP4(v, -1, aff
4af0: 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
4b00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4b10: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 46  ddOp2(v, OP_NotF
4b20: 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20 61 64 64  ound, iParm, add
4b30: 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
4b40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4b50: 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50 61 72   OP_Delete, iPar
4b60: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  m, 0);.      bre
4b70: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
4b80: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
4b90: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
4ba0: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
4bb0: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
4bc0: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
4bd0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
4be0: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
4bf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4c00: 32 28 76 2c 20 4f 50 5f 52 65 67 4d 61 6b 65 52  2(v, OP_RegMakeR
4c10: 65 63 2c 20 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d  ec, iMem, nColum
4c20: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  n);.      if( pO
4c30: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
4c40: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
4c50: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
4c60: 79 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  y, p);.      }el
4c70: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
4c80: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
4c90: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
4ca0: 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  arm);.        sq
4cb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4cc0: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
4cd0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4ce0: 65 33 43 6f 64 65 49 6e 73 65 72 74 28 70 50 61  e3CodeInsert(pPa
4cf0: 72 73 65 2c 20 69 50 61 72 6d 2c 20 4f 50 46 4c  rse, iParm, OPFL
4d00: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
4d10: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
4d20: 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
4d30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
4d40: 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77  UERY.    /* If w
4d50: 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61  e are creating a
4d60: 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70   set for an "exp
4d70: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
4d80: 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20  )" construct,.  
4d90: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
4da0: 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67  should be a sing
4db0: 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73  le item on the s
4dc0: 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69  tack.  Write thi
4dd0: 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e  s.    ** item in
4de0: 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65  to the set table
4df0: 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61   with bogus data
4e00: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
4e10: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
4e20: 20 20 20 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20     int addr2;.. 
4e30: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
4e40: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
4e50: 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
4e60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4e70: 5f 49 73 4e 75 6c 6c 2c 20 69 4d 65 6d 2c 20 30  _IsNull, iMem, 0
4e80: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69  );.      p->affi
4e90: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 43 6f  nity = sqlite3Co
4ea0: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
4eb0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
4ec0: 2c 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74  , pDest->affinit
4ed0: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  y);.      if( pO
4ee0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
4ef0: 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c    /* At first gl
4f00: 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74  ance you would t
4f10: 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70  hink we could op
4f20: 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20  timize out the. 
4f30: 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20         ** ORDER 
4f40: 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  BY in this case 
4f50: 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20  since the order 
4f60: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
4f70: 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a  e set.        **
4f80: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
4f90: 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67  .  But there mig
4fa0: 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c  ht be a LIMIT cl
4fb0: 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20  ause, in which. 
4fc0: 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
4fd0: 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61  he order does ma
4fe0: 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  tter */.        
4ff0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5000: 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  2(v, OP_SCopy, i
5010: 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Mem, 0);.       
5020: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
5030: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
5040: 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , p);.      }els
5050: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
5060: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
5070: 4f 50 5f 52 65 67 4d 61 6b 65 52 65 63 2c 20 69  OP_RegMakeRec, i
5080: 4d 65 6d 2c 20 31 2c 20 30 2c 20 26 70 2d 3e 61  Mem, 1, 0, &p->a
5090: 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
50a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
50b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
50c0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 30  Insert, iParm, 0
50d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
50e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
50f0: 48 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a  Here(v, addr2);.
5100: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5110: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   }..    /* If an
5120: 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74  y row exist in t
5130: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72  he result set, r
5140: 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20  ecord that fact 
5150: 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a  and abort..    *
5160: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
5170: 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73  xists: {.      s
5180: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5190: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
51a0: 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  1, iParm);.     
51b0: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
51c0: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
51d0: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
51e0: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
51f0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
5200: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
5210: 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
5220: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
5230: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
5240: 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
5250: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
5260: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
5270: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
5280: 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
5290: 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
52a0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
52b0: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
52c0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
52d0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
52e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
52f0: 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 4d 65 6d  , OP_SCopy, iMem
5300: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
5310: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
5320: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
5330: 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
5340: 72 42 79 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d  rBy, p);.      }
5350: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5360: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5370: 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 30 2c 20 69  v, OP_Move, 0, i
5380: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 2f  Parm);.        /
5390: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
53a0: 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
53b0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
53c0: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20   us */.      }. 
53d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
53e0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
53f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5400: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
5410: 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74   /* Send the dat
5420: 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  a to the callbac
5430: 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f  k function or to
5440: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20   a subroutine.  
5450: 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  In the.    ** ca
5460: 73 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69  se of a subrouti
5470: 6e 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ne, the subrouti
5480: 6e 65 20 69 74 73 65 6c 66 20 69 73 20 72 65 73  ne itself is res
5490: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20  ponsible for.   
54a0: 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20   ** popping the 
54b0: 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74  data from the st
54c0: 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
54d0: 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74  case SRT_Subrout
54e0: 69 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ine:.    case SR
54f0: 54 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20  T_Callback: {.  
5500: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
5510: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5520: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5530: 20 4f 50 5f 52 65 67 4d 61 6b 65 52 65 63 2c 20   OP_RegMakeRec, 
5540: 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  iMem, nColumn);.
5550: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
5560: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
5570: 4f 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20 20  OrderBy, p);.   
5580: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65     }else if( eDe
5590: 73 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69  st==SRT_Subrouti
55a0: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ne ){.        sq
55b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
55c0: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
55d0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  iParm);.      }e
55e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
55f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5600: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
5610: 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  iMem, nColumn);.
5620: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5630: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  eak;.    }..#if 
5640: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
5650: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
5660: 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
5670: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20   results.  This 
5680: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
5690: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  CT statements in
56a0: 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  side.    ** the 
56b0: 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
56c0: 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  R.  The purpose 
56d0: 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20  of such selects 
56e0: 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a  is to call.    *
56f0: 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  * user-defined f
5700: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  unctions that ha
5710: 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e  ve side effects.
5720: 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65    We do not care
5730: 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68  .    ** about th
5740: 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73  e actual results
5750: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a   of the select..
5760: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
5770: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
5780: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  rt( eDest==SRT_D
5790: 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20  iscard );.      
57a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
57b0: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
57c0: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
57d0: 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
57e0: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
57f0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
5800: 3e 69 4c 69 6d 69 74 3e 3d 30 20 26 26 20 70 4f  >iLimit>=0 && pO
5810: 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
5820: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5830: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
5840: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31 29 3b   p->iLimit, -1);
5850: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5860: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a  AddOp2(v, OP_IfZ
5870: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
5880: 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 72  iBreak);.  }.  r
5890: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
58a0: 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
58b0: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65  ssion list, gene
58c0: 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73  rate a KeyInfo s
58d0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
58e0: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c  cords.** the col
58f0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
5900: 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  for each express
5910: 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72  ion in that expr
5920: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
5930: 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  ** If the ExprLi
5940: 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  st is an ORDER B
5950: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
5960: 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65  ause then the re
5970: 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e  sulting.** KeyIn
5980: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
5990: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
59a0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
59b0: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a  irtual index to.
59c0: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61  ** implement tha
59d0: 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68  t clause.  If th
59e0: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68  e ExprList is th
59f0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
5a00: 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e  a SELECT.** then
5a10: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
5a20: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
5a30: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
5a40: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
5a50: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70  .** index to imp
5a60: 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43  lement a DISTINC
5a70: 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70  T test..**.** Sp
5a80: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
5a90: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
5aa0: 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d  e is obtain from
5ab0: 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61   malloc.  The ca
5ac0: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
5ad0: 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
5ae0: 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74   for seeing that
5af0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
5b00: 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  is eventually.**
5b10: 20 66 72 65 65 64 2e 20 20 41 64 64 20 74 68 65   freed.  Add the
5b20: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
5b30: 72 65 20 74 6f 20 74 68 65 20 50 34 20 66 69 65  re to the P4 fie
5b40: 6c 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20  ld of an opcode 
5b50: 75 73 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49  using.** P4_KEYI
5b60: 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74  NFO_HANDOFF is t
5b70: 68 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20  he usual way of 
5b80: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69  dealing with thi
5b90: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  s..*/.static Key
5ba0: 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f  Info *keyInfoFro
5bb0: 6d 45 78 70 72 4c 69 73 74 28 50 61 72 73 65 20  mExprList(Parse 
5bc0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73  *pParse, ExprLis
5bd0: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c  t *pList){.  sql
5be0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
5bf0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78  e->db;.  int nEx
5c00: 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  pr;.  KeyInfo *p
5c10: 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45  Info;.  struct E
5c20: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
5c30: 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  tem;.  int i;.. 
5c40: 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e   nExpr = pList->
5c50: 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d  nExpr;.  pInfo =
5c60: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
5c70: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
5c80: 2a 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a  *pInfo) + nExpr*
5c90: 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
5ca0: 29 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49  )+1) );.  if( pI
5cb0: 6e 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f  nfo ){.    pInfo
5cc0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
5cd0: 75 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c  u8*)&pInfo->aCol
5ce0: 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49  l[nExpr];.    pI
5cf0: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45  nfo->nField = nE
5d00: 78 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  xpr;.    pInfo->
5d10: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
5d20: 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
5d30: 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45  m=pList->a; i<nE
5d40: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
5d50: 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  +){.      CollSe
5d60: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
5d70: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
5d80: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
5d90: 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
5da0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  ;.      if( !pCo
5db0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
5dc0: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
5dd0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
5de0: 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b     pInfo->aColl[
5df0: 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
5e00: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
5e10: 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e  der[i] = pItem->
5e20: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
5e30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
5e40: 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  nfo;.}.../*.** I
5e50: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5e60: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75   was generated u
5e70: 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20  sing a non-null 
5e80: 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e  pOrderBy argumen
5e90: 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  t,.** then the r
5ea0: 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63  esults were plac
5eb0: 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20  ed in a sorter. 
5ec0: 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20   After the loop 
5ed0: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
5ee0: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20   we need to run 
5ef0: 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f  the sorter and o
5f00: 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74  utput the result
5f10: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
5f20: 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  g.** routine gen
5f30: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
5f40: 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61  needed to do tha
5f50: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
5f60: 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61  d generateSortTa
5f70: 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  il(.  Parse *pPa
5f80: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
5f90: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
5fa0: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
5fb0: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
5fc0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56  statement */.  V
5fd0: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
5fe0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
5ff0: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45  e into this VDBE
6000: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
6010: 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  n,      /* Numbe
6020: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
6030: 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
6040: 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57  Dest *pDest /* W
6050: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
6060: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
6070: 29 7b 0a 20 20 69 6e 74 20 62 72 6b 20 3d 20 73  ){.  int brk = s
6080: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
6090: 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 63 6f  bel(v);.  int co
60a0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
60b0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
60c0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20  int addr;.  int 
60d0: 69 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75  iTab;.  int pseu
60e0: 64 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70  doTab = 0;.  Exp
60f0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
6100: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a  = p->pOrderBy;..
6110: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
6120: 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e  est->eDest;.  in
6130: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
6140: 3e 69 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20 72  >iParm;..  int r
6150: 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67  egRow;.  int reg
6160: 52 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62 20 3d  Rowid;..  iTab =
6170: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
6180: 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74  sor;.  if( eDest
6190: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 7c  ==SRT_Callback |
61a0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75 62  | eDest==SRT_Sub
61b0: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 70  routine ){.    p
61c0: 73 65 75 64 6f 54 61 62 20 3d 20 70 50 61 72 73  seudoTab = pPars
61d0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
61e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
61f0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
6200: 6f 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29  o, pseudoTab, 0)
6210: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6220: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
6230: 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70 73 65  tNumColumns, pse
6240: 75 64 6f 54 61 62 2c 20 6e 43 6f 6c 75 6d 6e 29  udoTab, nColumn)
6250: 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 31  ;.  }.  addr = 1
6260: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
6270: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c  dOp2(v, OP_Sort,
6280: 20 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 63   iTab, brk);.  c
6290: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
62a0: 63 6f 6e 74 2c 20 30 29 3b 0a 20 20 72 65 67 52  cont, 0);.  regR
62b0: 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ow = sqlite3GetT
62c0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
62d0: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c    regRowid = sql
62e0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
62f0: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
6300: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6310: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  P_Column, iTab, 
6320: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
6330: 2b 20 31 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  + 1, regRow);.  
6340: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
6350: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
6360: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
6370: 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
6380: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6390: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
63a0: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67  owid, iParm, reg
63b0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
63c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
63d0: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50  v, OP_Insert, iP
63e0: 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67  arm, regRow, reg
63f0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
6400: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
6410: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
6420: 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ND);.      break
6430: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
6440: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
6450: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52  UERY.    case SR
6460: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69  T_Set: {.      i
6470: 6e 74 20 6a 31 3b 0a 20 20 20 20 20 20 61 73 73  nt j1;.      ass
6480: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
6490: 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71  );.      j1 = sq
64a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
64b0: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
64c0: 67 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c  gRow);.      sql
64d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
64e0: 2c 20 4f 50 5f 52 65 67 4d 61 6b 65 52 65 63 2c  , OP_RegMakeRec,
64f0: 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67 52   regRow, 1, regR
6500: 6f 77 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79  ow, &p->affinity
6510: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
6520: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6530: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
6540: 50 61 72 6d 2c 20 72 65 67 52 6f 77 29 3b 0a 20  Parm, regRow);. 
6550: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6560: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
6570: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6580: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
6590: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
65a0: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
65b0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
65c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
65d0: 50 5f 4d 6f 76 65 2c 20 72 65 67 52 6f 77 2c 20  P_Move, regRow, 
65e0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a  iParm);.      /*
65f0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
6600: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
6610: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
6620: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
6630: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
6640: 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62    case SRT_Callb
6650: 61 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ack:.    case SR
6660: 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a  T_Subroutine: {.
6670: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
6680: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6690: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
66a0: 65 72 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29  er, 1, regRowid)
66b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
66c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
66d0: 49 6e 73 65 72 74 2c 20 70 73 65 75 64 6f 54 61  Insert, pseudoTa
66e0: 62 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  b, regRow, regRo
66f0: 77 69 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  wid);.      for(
6700: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20  i=0; i<nColumn; 
6710: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
6720: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6730: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73  v, OP_Column, ps
6740: 65 75 64 6f 54 61 62 2c 20 69 2c 20 70 44 65 73  eudoTab, i, pDes
6750: 74 2d 3e 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20  t->iMem+i);.    
6760: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44    }.      if( eD
6770: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
6780: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  k ){.        sql
6790: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
67a0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
67b0: 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f  pDest->iMem, nCo
67c0: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lumn);.      }el
67d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
67e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
67f0: 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50   OP_Gosub, 0, iP
6800: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arm);.      }.  
6810: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6820: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
6830: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
6840: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  ing */.      bre
6850: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
6860: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
6870: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
6880: 67 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65 33  gRow);.  sqlite3
6890: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
68a0: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29  Parse, regRowid)
68b0: 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  ;..  /* Jump to 
68c0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
68d0: 6f 6f 70 20 77 68 65 6e 20 74 68 65 20 4c 49 4d  oop when the LIM
68e0: 49 54 20 69 73 20 72 65 61 63 68 65 64 0a 20 20  IT is reached.  
68f0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  */.  if( p->iLim
6900: 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  it>=0 ){.    sql
6910: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6920: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e  , OP_AddImm, p->
6930: 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20  iLimit, -1);.   
6940: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6950: 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p2(v, OP_IfZero,
6960: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 62 72 6b 29   p->iLimit, brk)
6970: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
6980: 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
6990: 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
69a0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
69b0: 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71  l(v, cont);.  sq
69c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
69d0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62  v, OP_Next, iTab
69e0: 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74  , addr);.  sqlit
69f0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
6a00: 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 69 66  el(v, brk);.  if
6a10: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
6a20: 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d  lback || eDest==
6a30: 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29  SRT_Subroutine )
6a40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
6a50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
6a60: 6f 73 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  ose, pseudoTab, 
6a70: 30 29 3b 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a  0);.  }..}../*.*
6a80: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
6a90: 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63  er to a string c
6aa0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64  ontaining the 'd
6ab0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27  eclaration type'
6ac0: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
6ad0: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65  ssion pExpr. The
6ae0: 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74   string may be t
6af0: 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63  reated as static
6b00: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
6b10: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  **.** The declar
6b20: 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68  ation type is th
6b30: 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65  e exact datatype
6b40: 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72   definition extr
6b50: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  acted from the.*
6b60: 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54  * original CREAT
6b70: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
6b80: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
6b90: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
6ba0: 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74   The.** declarat
6bb0: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52  ion type for a R
6bc0: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
6bd0: 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77  TEGER. Exactly w
6be0: 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  hen an expressio
6bf0: 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  n.** is consider
6c00: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  ed a column can 
6c10: 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68  be complex in th
6c20: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75  e presence of su
6c30: 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a  bqueries. The.**
6c40: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
6c50: 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66  ession in all of
6c60: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   the following S
6c70: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
6c80: 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72   is .** consider
6c90: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74  ed a column by t
6ca0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
6cb0: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c  .**   SELECT col
6cc0: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
6cd0: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
6ce0: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
6cf0: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
6d00: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   col FROM tbl);.
6d10: 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20  **   SELECT abc 
6d20: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c  FROM (SELECT col
6d30: 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c   AS abc FROM tbl
6d40: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65  );.** .** The de
6d50: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
6d60: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
6d70: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  n other than a c
6d80: 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a  olumn is NULL..*
6d90: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
6da0: 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28  har *columnType(
6db0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
6dc0: 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45  pNC, .  Expr *pE
6dd0: 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  xpr,.  const cha
6de0: 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a  r **pzOriginDb,.
6df0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
6e00: 7a 4f 72 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f  zOriginTab,.  co
6e10: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
6e20: 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72  ginCol.){.  char
6e30: 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20   const *zType = 
6e40: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
6e50: 2a 7a 4f 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a  *zOriginDb = 0;.
6e60: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
6e70: 72 69 67 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20  riginTab = 0;.  
6e80: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
6e90: 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e  ginCol = 0;.  in
6ea0: 74 20 6a 3b 0a 20 20 69 66 28 20 70 45 78 70 72  t j;.  if( pExpr
6eb0: 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63  ==0 || pNC->pSrc
6ec0: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
6ed0: 20 30 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   0;..  switch( p
6ee0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
6ef0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
6f00: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
6f10: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
6f20: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
6f30: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c  n is a column. L
6f40: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
6f50: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65  the column is be
6f60: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74  ing.      ** ext
6f70: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e  racted from in N
6f80: 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c  ameContext.pSrcL
6f90: 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20  ist. This table 
6fa0: 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20  may be real.    
6fb0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61    ** database ta
6fc0: 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65 72  ble or a subquer
6fd0: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
6fe0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
6ff0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
7000: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
7010: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
7020: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
7030: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
7040: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
7050: 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c  * Select the col
7060: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
7070: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69   from */.      i
7080: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
7090: 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e  >iColumn;  /* In
70a0: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
70b0: 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 77   pTab */.      w
70c0: 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54  hile( pNC && !pT
70d0: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72  ab ){.        Sr
70e0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
70f0: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
7100: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
7110: 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ;j<pTabList->nSr
7120: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
7130: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78  [j].iCursor!=pEx
7140: 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b  pr->iTable;j++);
7150: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
7160: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b  TabList->nSrc ){
7170: 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20  .          pTab 
7180: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
7190: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  .pTab;.         
71a0: 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e   pS = pTabList->
71b0: 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[j].pSelect;.  
71c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
71d0: 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43         pNC = pNC
71e0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
71f0: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
7200: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
7210: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 49 58 20  .        /* FIX 
7220: 4d 45 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  ME:.        ** T
7230: 68 69 73 20 63 61 6e 20 6f 63 63 75 72 73 20 69  his can occurs i
7240: 66 20 79 6f 75 20 68 61 76 65 20 73 6f 6d 65 74  f you have somet
7250: 68 69 6e 67 20 6c 69 6b 65 20 22 53 45 4c 45 43  hing like "SELEC
7260: 54 20 6e 65 77 2e 78 3b 22 20 69 6e 73 69 64 65  T new.x;" inside
7270: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72  .        ** a tr
7280: 69 67 67 65 72 2e 20 20 49 6e 20 6f 74 68 65 72  igger.  In other
7290: 20 77 6f 72 64 73 2c 20 69 66 20 79 6f 75 20 72   words, if you r
72a0: 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 70 65  eference the spe
72b0: 63 69 61 6c 20 22 6e 65 77 22 0a 20 20 20 20 20  cial "new".     
72c0: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 6e 20 74     ** table in t
72d0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
72e0: 20 61 20 73 65 6c 65 63 74 2e 20 20 57 65 20 64   a select.  We d
72f0: 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 67 6f 6f  o not have a goo
7300: 64 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a  d way.        **
7310: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 61 63 74   to find the act
7320: 75 61 6c 20 74 61 62 6c 65 20 74 79 70 65 2c 20  ual table type, 
7330: 73 6f 20 63 61 6c 6c 20 69 74 20 22 54 45 58 54  so call it "TEXT
7340: 22 2e 20 20 54 68 69 73 20 69 73 20 72 65 61 6c  ".  This is real
7350: 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  ly.        ** so
7360: 6d 65 74 68 69 6e 67 20 6f 66 20 61 20 62 75 67  mething of a bug
7370: 2c 20 62 75 74 20 49 20 64 6f 20 6e 6f 74 20 6b  , but I do not k
7380: 6e 6f 77 20 68 6f 77 20 74 6f 20 66 69 78 20 69  now how to fix i
7390: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t..        **.  
73a0: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
73b0: 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 64  de does not prod
73c0: 75 63 65 20 74 68 65 20 63 6f 72 72 65 63 74 20  uce the correct 
73d0: 61 6e 73 77 65 72 20 2d 20 69 74 20 6a 75 73 74  answer - it just
73e0: 20 70 72 65 76 65 6e 74 73 0a 20 20 20 20 20 20   prevents.      
73f0: 20 20 2a 2a 20 61 20 73 65 67 66 61 75 6c 74 2e    ** a segfault.
7400: 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 31 32    See ticket #12
7410: 32 39 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  29..        */. 
7420: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
7430: 54 45 58 54 22 3b 0a 20 20 20 20 20 20 20 20 62  TEXT";.        b
7440: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
7450: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
7460: 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b );.      if( p
7470: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  S ){.        /* 
7480: 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61  The "table" is a
7490: 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65  ctually a sub-se
74a0: 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69  lect or a view i
74b0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
74c0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
74d0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
74e0: 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65  ment. Return the
74f0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
7500: 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20  e and origin.   
7510: 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72       ** data for
7520: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20   the result-set 
7530: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75  column of the su
7540: 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20  b-select..      
7550: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
7560: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
7570: 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <pS->pEList->nEx
7580: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
7590: 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65  /* If iCol is le
75a0: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
75b0: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
75c0: 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20  n requests the. 
75d0: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69           ** rowi
75e0: 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  d of the sub-sel
75f0: 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69  ect or view. Thi
7600: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
7610: 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20  legal (see .    
7620: 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61        ** test ca
7630: 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20  se misc2.2.2) - 
7640: 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61  it always evalua
7650: 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20  tes to NULL..   
7660: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
7670: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
7680: 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45  sNC;.          E
7690: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
76a0: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
76b0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  pr;.          sN
76c0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
76d0: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20  >pSrc;.         
76e0: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a   sNC.pNext = 0;.
76f0: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50            sNC.pP
7700: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
7710: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se;.          zT
7720: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
7730: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
7740: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
7750: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
7760: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
7770: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
7780: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
7790: 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74       /* A real t
77a0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
77b0: 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20  assert( !pS );. 
77c0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
77d0: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
77e0: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
77f0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
7800: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
7810: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
7820: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
7830: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
7840: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
7850: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20  EGER";.         
7860: 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72   zOriginCol = "r
7870: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d  owid";.        }
7880: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7890: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
78a0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
78b0: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
78c0: 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  nCol = pTab->aCo
78d0: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
78e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
78f0: 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 70 54   zOriginTab = pT
7900: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
7910: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
7920: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
7930: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
7940: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
7950: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  NC->pParse->db, 
7960: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
7970: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
7980: 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  nDb = pNC->pPars
7990: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
79a0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
79b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
79c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
79d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
79e0: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
79f0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
7a00: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
7a10: 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d  ession is a sub-
7a20: 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74  select. Return t
7a30: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
7a40: 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ype and.      **
7a50: 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72   origin info for
7a60: 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75   the single colu
7a70: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
7a80: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
7a90: 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  CT.      ** stat
7aa0: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
7ab0: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
7ac0: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
7ad0: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
7ae0: 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
7af0: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
7b00: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
7b10: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63  ;.      sNC.pSrc
7b20: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
7b30: 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74  .      sNC.pNext
7b40: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e   = pNC;.      sN
7b50: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
7b60: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54  pParse;.      zT
7b70: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
7b80: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
7b90: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
7ba0: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
7bb0: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
7bc0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
7bd0: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69    .  if( pzOrigi
7be0: 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nDb ){.    asser
7bf0: 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26  t( pzOriginTab &
7c00: 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b  & pzOriginCol );
7c10: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62  .    *pzOriginDb
7c20: 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20   = zOriginDb;.  
7c30: 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d    *pzOriginTab =
7c40: 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20   zOriginTab;.   
7c50: 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20   *pzOriginCol = 
7c60: 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a  zOriginCol;.  }.
7c70: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
7c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
7c90: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
7ca0: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
7cb0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
7cc0: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
7cd0: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
7ce0: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
7cf0: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
7d00: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
7d10: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
7d20: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
7d30: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
7d40: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
7d50: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
7d60: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
7d70: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
7d80: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
7d90: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
7da0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
7db0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
7dc0: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
7dd0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
7de0: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
7df0: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
7e00: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f  e = pParse;.  fo
7e10: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
7e20: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
7e30: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
7e40: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
7e50: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
7e60: 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20  zOrigDb = 0;.   
7e70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
7e80: 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63  igTab = 0;.    c
7e90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
7ea0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  Col = 0;.    con
7eb0: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  st char *zType =
7ec0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
7ed0: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
7ee0: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
7ef0: 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  Col);..    /* Th
7f00: 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65  e vdbe must make
7f10: 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66   its own copy of
7f20: 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65   the column-type
7f30: 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20   and other .    
7f40: 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66  ** column specif
7f50: 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63  ic strings, in c
7f60: 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69  ase the schema i
7f70: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74  s reset before t
7f80: 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75  his.    ** virtu
7f90: 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65  al machine is de
7fa0: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
7fb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
7fc0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
7fd0: 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20  LNAME_DECLTYPE, 
7fe0: 7a 54 79 70 65 2c 20 50 34 5f 54 52 41 4e 53 49  zType, P4_TRANSI
7ff0: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
8000: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8010: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41  v, i, COLNAME_DA
8020: 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c  TABASE, zOrigDb,
8030: 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a   P4_TRANSIENT);.
8040: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8050: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
8060: 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a  COLNAME_TABLE, z
8070: 4f 72 69 67 54 61 62 2c 20 50 34 5f 54 52 41 4e  OrigTab, P4_TRAN
8080: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
8090: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
80a0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
80b0: 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c  COLUMN, zOrigCol
80c0: 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b  , P4_TRANSIENT);
80d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
80e0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
80f0: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
8100: 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  DBE the names of
8110: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
8120: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
8130: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
8140: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76   is used to prov
8150: 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c  ide the.** azCol
8160: 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  [] values in the
8170: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   callback..*/.st
8180: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
8190: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20  teColumnNames(. 
81a0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
81b0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
81c0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
81d0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
81e0: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
81f0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
8200: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
8210: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
8220: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
8230: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
8240: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
8250: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  e;.  int i, j;. 
8260: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8270: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
8280: 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72   fullNames, shor
8290: 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66  tNames;..#ifndef
82a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
82b0: 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69  LAIN.  /* If thi
82c0: 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c  s is an EXPLAIN,
82d0: 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20   skip this step 
82e0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
82f0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
8300: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
8310: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21  if..  assert( v!
8320: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  =0 );.  if( pPar
8330: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
8340: 7c 7c 20 76 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  || v==0 || db->m
8350: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
8360: 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e  turn;.  pParse->
8370: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
8380: 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28  .  fullNames = (
8390: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
83a0: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
83b0: 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65  !=0;.  shortName
83c0: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
83d0: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
83e0: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c  Names)!=0;.  sql
83f0: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
8400: 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  ls(v, pEList->nE
8410: 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  xpr);.  for(i=0;
8420: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
8430: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
8440: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c   *p;.    p = pEL
8450: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
8460: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
8470: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
8480: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
8490: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Name ){.      ch
84a0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
84b0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
84c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
84d0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
84e0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
84f0: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
8500: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e  ame));.      con
8510: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
8520: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
8530: 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73  OLUMN && pTabLis
8540: 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  t ){.      Table
8550: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68   *pTab;.      ch
8560: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
8570: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
8580: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72  olumn;.      for
8590: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74  (j=0; j<pTabList
85a0: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
85b0: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
85c0: 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b  !=p->iTable; j++
85d0: 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74  ){}.      assert
85e0: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
85f0: 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rc );.      pTab
8600: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
8610: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ].pTab;.      if
8620: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
8630: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
8640: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
8650: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
8660: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
8670: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
8680: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
8690: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
86a0: 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
86b0: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
86c0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
86d0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
86e0: 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72  .      if( !shor
86f0: 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e  tNames && !fullN
8700: 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e  ames && p->span.
8710: 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30  z && p->span.z[0
8720: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
8730: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
8740: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
8750: 5f 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d  _NAME, (char*)p-
8760: 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e  >span.z, p->span
8770: 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .n);.      }else
8780: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c   if( fullNames |
8790: 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20 26  | (!shortNames &
87a0: 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  & pTabList->nSrc
87b0: 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >1) ){.        c
87c0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
87d0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
87e0: 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54  ab;. .        zT
87f0: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
8800: 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  [j].zAlias;.    
8810: 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65      if( fullName
8820: 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a  s || zTab==0 ) z
8830: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
8840: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
8850: 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61  e3SetString(&zNa
8860: 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a  me, zTab, ".", z
8870: 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Col, (char*)0);.
8880: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8890: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
88a0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
88b0: 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41  , zName, P4_DYNA
88c0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
88d0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
88e0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
88f0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
8900: 41 4d 45 2c 20 7a 43 6f 6c 2c 20 73 74 72 6c 65  AME, zCol, strle
8910: 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20  n(zCol));.      
8920: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
8930: 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e  p->span.z && p->
8940: 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  span.z[0] ){.   
8950: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8960: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
8970: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68  OLNAME_NAME, (ch
8980: 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70  ar*)p->span.z, p
8990: 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20  ->span.n);.     
89a0: 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43   /* sqlite3VdbeC
89b0: 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c 20  ompressSpace(v, 
89c0: 61 64 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65  addr); */.    }e
89d0: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
89e0: 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20  zName[30];.     
89f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
8a00: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61  TK_COLUMN || pTa
8a10: 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  bList==0 );.    
8a20: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8a30: 74 66 28 73 69 7a 65 6f 66 28 7a 4e 61 6d 65 29  tf(sizeof(zName)
8a40: 2c 20 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e  , zName, "column
8a50: 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  %d", i+1);.     
8a60: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8a70: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8a80: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
8a90: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
8aa0: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
8ab0: 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54  Types(pParse, pT
8ac0: 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
8ad0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
8ae0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
8af0: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61  _SELECT./*.** Na
8b00: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  me of the connec
8b10: 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75  tion operator, u
8b20: 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  sed for error me
8b30: 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssages..*/.stati
8b40: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65  c const char *se
8b50: 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69  lectOpName(int i
8b60: 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  d){.  char *z;. 
8b70: 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20   switch( id ){. 
8b80: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
8b90: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
8ba0: 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a   ALL";   break;.
8bb0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
8bc0: 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45  RSECT: z = "INTE
8bd0: 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b  RSECT";   break;
8be0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
8bf0: 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43  EPT:    z = "EXC
8c00: 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  EPT";      break
8c10: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
8c20: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e           z = "UN
8c30: 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61  ION";       brea
8c40: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
8c50: 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  z;.}.#endif /* S
8c60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
8c70: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f  UND_SELECT */../
8c80: 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63  *.** Forward dec
8c90: 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  laration.*/.stat
8ca0: 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63  ic int prepSelec
8cb0: 74 53 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65  tStmt(Parse*, Se
8cc0: 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47  lect*);../*.** G
8cd0: 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74  iven a SELECT st
8ce0: 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74  atement, generat
8cf0: 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  e a Table struct
8d00: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
8d10: 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  es.** the result
8d20: 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c   set of that SEL
8d30: 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ECT..*/.Table *s
8d40: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
8d50: 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  fSelect(Parse *p
8d60: 50 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61  Parse, char *zTa
8d70: 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70  bName, Select *p
8d80: 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
8d90: 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c   *pTab;.  int i,
8da0: 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   j;.  ExprList *
8db0: 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e  pEList;.  Column
8dc0: 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 20   *aCol, *pCol;. 
8dd0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8de0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 77 68  Parse->db;..  wh
8df0: 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50  ile( pSelect->pP
8e00: 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d  rior ) pSelect =
8e10: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
8e20: 3b 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65  ;.  if( prepSele
8e30: 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70  ctStmt(pParse, p
8e40: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72  Select) ){.    r
8e50: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
8e60: 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
8e70: 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20  Resolve(pParse, 
8e80: 70 53 65 6c 65 63 74 2c 20 30 29 20 29 7b 0a 20  pSelect, 0) ){. 
8e90: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
8ea0: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
8eb0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
8ec0: 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  , sizeof(Table) 
8ed0: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
8ee0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
8ef0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 6e 52  ;.  }.  pTab->nR
8f00: 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e  ef = 1;.  pTab->
8f10: 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65  zName = zTabName
8f20: 20 3f 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   ? sqlite3DbStrD
8f30: 75 70 28 64 62 2c 20 7a 54 61 62 4e 61 6d 65 29  up(db, zTabName)
8f40: 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d   : 0;.  pEList =
8f50: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
8f60: 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d  ;.  pTab->nCol =
8f70: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
8f80: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
8f90: 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62  nCol>0 );.  pTab
8fa0: 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20  ->aCol = aCol = 
8fb0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
8fc0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 70  ero(db, sizeof(p
8fd0: 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54  Tab->aCol[0])*pT
8fe0: 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 66 6f 72  ab->nCol);.  for
8ff0: 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b  (i=0, pCol=aCol;
9000: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
9010: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
9020: 20 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a 20   Expr *p, *pR;. 
9030: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a     char *zType;.
9040: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
9050: 0a 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  .    int nName;.
9060: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
9070: 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 3b  ll;.    int cnt;
9080: 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
9090: 20 73 4e 43 3b 0a 20 20 20 20 0a 20 20 20 20 2f   sNC;.    .    /
90a0: 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72  * Get an appropr
90b0: 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  iate name for th
90c0: 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a  e column.    */.
90d0: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
90e0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
90f0: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
9100: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68  t==0 || p->pRigh
9110: 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c  t->token.z==0 ||
9120: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
9130: 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  n.z[0]!=0 );.   
9140: 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45   if( (zName = pE
9150: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
9160: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
9170: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   If the column c
9180: 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c  ontains an "AS <
9190: 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75  name>" phrase, u
91a0: 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65  se <name> as the
91b0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a   name */.      z
91c0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
91d0: 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65  StrDup(db, zName
91e0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
91f0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a   p->op==TK_DOT .
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
9210: 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74 29 21   (pR=p->pRight)!
9220: 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e  =0 && pR->token.
9230: 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a  z && pR->token.z
9240: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  [0] ){.      /* 
9250: 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  For columns of t
9260: 68 65 20 66 72 6f 6d 20 41 2e 42 20 75 73 65 20  he from A.B use 
9270: 42 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  B as the name */
9280: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
9290: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
92a0: 2c 20 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b  , "%T", &pR->tok
92b0: 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  en);.    }else i
92c0: 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  f( p->span.z && 
92d0: 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a  p->span.z[0] ){.
92e0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65        /* Use the
92f0: 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f   original text o
9300: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70  f the column exp
9310: 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e  ression as its n
9320: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61  ame */.      zNa
9330: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
9340: 6e 74 66 28 64 62 2c 20 22 25 54 22 2c 20 26 70  ntf(db, "%T", &p
9350: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c  ->span);.    }el
9360: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  se{.      /* If 
9370: 61 6c 6c 20 65 6c 73 65 20 66 61 69 6c 73 2c 20  all else fails, 
9380: 6d 61 6b 65 20 75 70 20 61 20 6e 61 6d 65 20 2a  make up a name *
9390: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
93a0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
93b0: 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  b, "column%d", i
93c0: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  +1);.    }.    i
93d0: 66 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 64 62 2d  f( !zName || db-
93e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
93f0: 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  .      db->mallo
9400: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
9410: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9420: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
9430: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
9440: 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 72 65  (pTab);.      re
9450: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
9460: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
9470: 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a  (zName);..    /*
9480: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
9490: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e  olumn name is un
94a0: 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61  ique.  If the na
94b0: 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65  me is not unique
94c0: 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20  ,.    ** append 
94d0: 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65  a integer to the
94e0: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74   name so that it
94f0: 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e   becomes unique.
9500: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d  .    */.    nNam
9510: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
9520: 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74  );.    for(j=cnt
9530: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
9540: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9550: 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e  StrICmp(aCol[j].
9560: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
9570: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   ){.        zNam
9580: 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20  e[nName] = 0;.  
9590: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
95a0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
95b0: 20 22 25 7a 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c   "%z:%d", zName,
95c0: 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20   ++cnt);.       
95d0: 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   j = -1;.       
95e0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
95f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9600: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a     }.    pCol->z
9610: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20  Name = zName;.. 
9620: 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 74 79     /* Get the ty
9630: 70 65 6e 61 6d 65 2c 20 74 79 70 65 20 61 66 66  pename, type aff
9640: 69 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c 6c 61  inity, and colla
9650: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
9660: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c  r the.    ** col
9670: 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  umn..    */.    
9680: 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
9690: 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
96a0: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
96b0: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
96c0: 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69      zType = sqli
96d0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
96e0: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
96f0: 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a 20   p, 0, 0, 0));. 
9700: 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d     pCol->zType =
9710: 20 7a 54 79 70 65 3b 0a 20 20 20 20 70 43 6f 6c   zType;.    pCol
9720: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
9730: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
9740: 28 70 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  (p);.    pColl =
9750: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
9760: 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
9770: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
9780: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f  .      pCol->zCo
9790: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ll = sqlite3DbSt
97a0: 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e  rDup(db, pColl->
97b0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
97c0: 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20  }.  pTab->iPKey 
97d0: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  = -1;.  return p
97e0: 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  Tab;.}../*.** Pr
97f0: 65 70 61 72 65 20 61 20 53 45 4c 45 43 54 20 73  epare a SELECT s
9800: 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f  tatement for pro
9810: 63 65 73 73 69 6e 67 20 62 79 20 64 6f 69 6e 67  cessing by doing
9820: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
9830: 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20  * things:.**.** 
9840: 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72     (1)  Make sur
9850: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
9860: 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
9870: 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72  assigned to ever
9880: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65  y.**         ele
9890: 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  ment of the FROM
98a0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
98b0: 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74    (2)  Fill in t
98c0: 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
98d0: 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
98e0: 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
98f0: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
9900: 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  ines FROM clause
9910: 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70  .  When views ap
9920: 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
9930: 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20   clause,.**     
9940: 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
9950: 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
9960: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
9970: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
9980: 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
9990: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
99a0: 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
99b0: 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
99c0: 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
99d0: 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
99e0: 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
99f0: 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
9a00: 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
9a10: 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
9a20: 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
9a30: 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
9a40: 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74  g up the presist
9a50: 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
9a60: 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
9a70: 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
9a80: 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72      (3)  Add ter
9a90: 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
9aa0: 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f  clause to accomo
9ab0: 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c  date the NATURAL
9ac0: 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20   keyword.**     
9ad0: 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64      on joins and
9ae0: 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
9af0: 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e  G clause of join
9b00: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20  s..**.**    (4) 
9b10: 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f   Scan the list o
9b20: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
9b30: 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c   result set (pEL
9b40: 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20  ist) looking.** 
9b50: 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74          for inst
9b60: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22  ances of the "*"
9b70: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65   operator or the
9b80: 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f   TABLE.* operato
9b90: 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66  r..**         If
9ba0: 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65   found, expand e
9bb0: 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76  ach "*" to be ev
9bc0: 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76  ery column in ev
9bd0: 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  ery table.**    
9be0: 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a       and TABLE.*
9bf0: 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
9c00: 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a  umn in TABLE..**
9c10: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20  .** Return 0 on 
9c20: 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
9c30: 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c  re are problems,
9c40: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
9c50: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
9c60: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
9c70: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  non-zero..*/.sta
9c80: 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65  tic int prepSele
9c90: 63 74 53 74 6d 74 28 50 61 72 73 65 20 2a 70 50  ctStmt(Parse *pP
9ca0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
9cb0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c  {.  int i, j, k,
9cc0: 20 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   rc;.  SrcList *
9cd0: 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
9ce0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
9cf0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
9d00: 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71  tem *pFrom;.  sq
9d10: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
9d20: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
9d30: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d  ==0 || p->pSrc==
9d40: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
9d50: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
9d60: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 1;.  }.  pTa
9d70: 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
9d80: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
9d90: 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  EList;..  /* Mak
9da0: 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
9db0: 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
9dc0: 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
9dd0: 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
9de0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
9df0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
9e00: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
9e10: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
9e20: 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
9e30: 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 0a 20  se, p->pSrc);.. 
9e40: 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
9e50: 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
9e60: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
9e70: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
9e80: 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
9e90: 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
9ea0: 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
9eb0: 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
9ec0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
9ed0: 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
9ee0: 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
9ef0: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
9f00: 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
9f10: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
9f20: 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
9f30: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
9f40: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
9f50: 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
9f60: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69  ble *pTab;.    i
9f70: 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  f( pFrom->pTab!=
9f80: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
9f90: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  is statement has
9fa0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
9fb0: 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69  epared.  There i
9fc0: 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20  s no need.      
9fd0: 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72  ** to go further
9fe0: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
9ff0: 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( i==0 );.     
a000: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
a010: 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
a020: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e  zName==0 ){.#ifn
a030: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a040: 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 2f  SUBQUERY.      /
a050: 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
a060: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
a070: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
a080: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
a090: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  rom->pSelect!=0 
a0a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72  );.      if( pFr
a0b0: 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b  om->zAlias==0 ){
a0c0: 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
a0d0: 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20 20 20 20  zAlias =.       
a0e0: 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
a0f0: 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 75  f(db, "sqlite_su
a100: 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f  bquery_%p_", (vo
a110: 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  id*)pFrom->pSele
a120: 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
a130: 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
a140: 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
a150: 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
a160: 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
a170: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
a180: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
a190: 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c  , pFrom->zAlias,
a1a0: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
a1b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
a1c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
a1d0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
a1e0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73  .      /* The is
a1f0: 45 70 68 65 6d 20 66 6c 61 67 20 69 6e 64 69 63  Ephem flag indic
a200: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 54 61  ates that the Ta
a210: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 61  ble structure ha
a220: 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a 20  s been.      ** 
a230: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
a240: 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20 62 65  cated and may be
a250: 20 66 72 65 65 64 20 61 74 20 61 6e 79 20 74 69   freed at any ti
a260: 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  me.  In other wo
a270: 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70 54  rds,.      ** pT
a280: 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  ab is not pointi
a290: 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73 74 65  ng to a persiste
a2a0: 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
a2b0: 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 0a  re that defines.
a2c0: 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f 66        ** part of
a2d0: 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a   the schema. */.
a2e0: 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73 45 70        pTab->isEp
a2f0: 68 65 6d 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  hem = 1;.#endif.
a300: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a310: 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
a320: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
a330: 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
a340: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
a350: 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
a360: 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
a370: 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
a380: 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
a390: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
a3a0: 70 50 61 72 73 65 2c 70 46 72 6f 6d 2d 3e 7a 4e  pParse,pFrom->zN
a3b0: 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61  ame,pFrom->zData
a3c0: 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  base);.      if(
a3d0: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
a3e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
a3f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62      }.      pTab
a400: 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64  ->nRef++;.#if !d
a410: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a420: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
a430: 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49  ined (SQLITE_OMI
a440: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
a450: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
a460: 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69 72  pSelect || IsVir
a470: 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
a480: 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63        /* We reac
a490: 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e 61  h here if the na
a4a0: 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20 72  med table is a r
a4b0: 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a  eally a view */.
a4c0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
a4d0: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
a4e0: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
a4f0: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
a500: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
a510: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
a520: 49 66 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  If pFrom->pSelec
a530: 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20 77 65  t!=0 it means we
a540: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
a550: 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  h a.        ** v
a560: 69 65 77 20 77 69 74 68 69 6e 20 61 20 76 69 65  iew within a vie
a570: 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73  w.  The SELECT s
a580: 74 72 75 63 74 75 72 65 20 68 61 73 20 61 6c 72  tructure has alr
a590: 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 20 20  eady been.      
a5a0: 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79 20 74    ** copied by t
a5b0: 68 65 20 6f 75 74 65 72 20 76 69 65 77 20 73 6f  he outer view so
a5c0: 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74 68 65   we can skip the
a5d0: 20 63 6f 70 79 20 73 74 65 70 20 68 65 72 65 0a   copy step here.
a5e0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
a5f0: 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20 20  e inner view..  
a600: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a610: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c   if( pFrom->pSel
a620: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
a630: 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65      pFrom->pSele
a640: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
a650: 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e  ctDup(db, pTab->
a660: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
a670: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
a680: 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
a690: 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
a6a0: 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
a6b0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
a6c0: 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
a6d0: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
a6e0: 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61  eProcessJoin(pPa
a6f0: 72 73 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e  rse, p) ) return
a700: 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76   1;..  /* For ev
a710: 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
a720: 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
a730: 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
a740: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
a750: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
a760: 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
a770: 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
a780: 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
a790: 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
a7a0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
a7b0: 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
a7c0: 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
a7d0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
a7e0: 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c   with the TK_ALL
a7f0: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
a800: 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
a810: 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
a820: 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68  mn list..  ** Th
a830: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
a840: 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63   just has to loc
a850: 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65  ate the TK_ALL e
a860: 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
a870: 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20  xpand.  ** each 
a880: 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
a890: 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
a8a0: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  n all tables..  
a8b0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
a8c0: 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
a8d0: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
a8e0: 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
a8f0: 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
a900: 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
a910: 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
a920: 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
a930: 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; k++){.    Ex
a940: 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d  pr *pE = pEList-
a950: 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
a960: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
a970: 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ALL ) break;.   
a980: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
a990: 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68  DOT && pE->pRigh
a9a0: 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  t && pE->pRight-
a9b0: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20  >op==TK_ALL.    
a9c0: 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66       && pE->pLef
a9d0: 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  t && pE->pLeft->
a9e0: 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61  op==TK_ID ) brea
a9f0: 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b  k;.  }.  rc = 0;
aa00: 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
aa10: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
aa20: 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
aa30: 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
aa40: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
aa50: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
aa60: 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
aa70: 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
aa80: 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
aa90: 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
aaa0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
aab0: 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
aac0: 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
aad0: 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
aae0: 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
aaf0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
ab00: 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
ab10: 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
ab20: 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
ab30: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50    int flags = pP
ab40: 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b  arse->db->flags;
ab50: 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d  .    int longNam
ab60: 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  es = (flags & SQ
ab70: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
ab80: 73 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20  s)!=0 &&.       
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
aba0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
abb0: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  hortColNames)==0
abc0: 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  ;..    for(k=0; 
abd0: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
abe0: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   k++){.      Exp
abf0: 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78  r *pE = a[k].pEx
ac00: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
ac10: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a  ->op!=TK_ALL &&.
ac20: 20 20 20 20 20 20 20 20 20 20 20 28 70 45 2d 3e             (pE->
ac30: 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
ac40: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70  ->pRight==0 || p
ac50: 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54  E->pRight->op!=T
ac60: 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  K_ALL) ){.      
ac70: 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63    /* This partic
ac80: 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ular expression 
ac90: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
aca0: 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20   be expanded..  
acb0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
acc0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
acd0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
ace0: 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d  arse, pNew, a[k]
acf0: 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
ad00: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
ad10: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
ad20: 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
ad30: 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e  .zName = a[k].zN
ad40: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ame;.        }el
ad50: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
ad60: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
ad70: 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78          a[k].pEx
ad80: 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pr = 0;.        
ad90: 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
ada0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
adb0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70       /* This exp
adc0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22  ression is a "*"
add0: 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20   or a "TABLE.*" 
ade0: 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  and needs to be.
adf0: 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e          ** expan
ae00: 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ded. */.        
ae10: 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20  int tableSeen = 
ae20: 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  0;      /* Set t
ae30: 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d  o 1 when TABLE m
ae40: 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
ae50: 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20    char *zTName; 
ae60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65             /* te
ae70: 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
ae80: 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
ae90: 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
aea0: 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 29  T && pE->pLeft )
aeb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  {.          zTNa
aec0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
aed0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 26 70  FromToken(db, &p
aee0: 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29  E->pLeft->token)
aef0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
af00: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d  .          zTNam
af10: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
af20: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
af30: 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
af40: 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
af50: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
af60: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
af70: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
af80: 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  rom->pTab;.     
af90: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
afa0: 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c  ame = pFrom->zAl
afb0: 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ias;.          i
afc0: 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  f( zTabName==0 |
afd0: 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  | zTabName[0]==0
afe0: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
aff0: 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62   zTabName = pTab
b000: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
b010: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
b020: 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 28 7a 54  f( zTName && (zT
b030: 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61  abName==0 || zTa
b040: 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a  bName[0]==0 || .
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b060: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
b070: 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  zTName, zTabName
b080: 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  )!=0) ){.       
b090: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
b0a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b0b0: 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d       tableSeen =
b0c0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   1;.          fo
b0d0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
b0e0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
b0f0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
b100: 70 72 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20  pr, *pRight;.   
b110: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
b120: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Name = pTab->aCo
b130: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20  l[j].zName;..   
b140: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
b150: 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65   column is marke
b160: 64 20 61 73 20 27 68 69 64 64 65 6e 27 20 28 63  d as 'hidden' (c
b170: 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f  urrently only po
b180: 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20  ssible.         
b190: 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61     ** for virtua
b1a0: 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f  l tables), do no
b1b0: 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20  t include it in 
b1c0: 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20  the expanded.   
b1d0: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75           ** resu
b1e0: 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20  lt-set list..   
b1f0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
b200: 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48 69          if( IsHi
b210: 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62  ddenColumn(&pTab
b220: 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20  ->aCol[j]) ){.  
b230: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
b240: 72 74 28 49 73 56 69 72 74 75 61 6c 28 70 54 61  rt(IsVirtual(pTa
b250: 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b));.           
b260: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
b270: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
b280: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
b290: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
b2a0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
b2b0: 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70  item *pLeft = &p
b2c0: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b  TabList->a[i-1];
b2d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
b2e0: 66 28 20 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f 69  f( (pLeft[1].joi
b2f0: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
b300: 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  AL)!=0 &&.      
b310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b320: 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c    columnIndex(pL
b330: 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65  eft->pTab, zName
b340: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
b350: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
b360: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
b370: 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
b380: 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
b390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
b3a0: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69   table on the ri
b3b0: 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ght */.         
b3c0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
b3d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
b3e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
b3f0: 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  f( sqlite3IdList
b400: 49 6e 64 65 78 28 70 4c 65 66 74 5b 31 5d 2e 70  Index(pLeft[1].p
b410: 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
b420: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b430: 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e      /* In a join
b440: 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c   with a USING cl
b450: 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d  ause, omit colum
b460: 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
b470: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69            ** usi
b480: 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  ng clause from t
b490: 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
b4a0: 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  right. */.      
b4b0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
b4c0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
b4d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
b4e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
b4f0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 50 45  ight = sqlite3PE
b500: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
b510: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
b520: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69           if( pRi
b530: 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ght==0 ) break;.
b540: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 51              setQ
b550: 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50 61 72 73  uotedToken(pPars
b560: 65 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65  e, &pRight->toke
b570: 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  n, zName);.     
b580: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
b590: 61 6d 65 20 26 26 20 28 6c 6f 6e 67 4e 61 6d 65  ame && (longName
b5a0: 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s || pTabList->n
b5b0: 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20  Src>1) ){.      
b5c0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
b5d0: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78  eft = sqlite3PEx
b5e0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44  pr(pParse, TK_ID
b5f0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
b600: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
b610: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
b620: 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
b630: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29  Left, pRight, 0)
b640: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b650: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 62  if( pExpr==0 ) b
b660: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
b670: 20 20 20 20 73 65 74 51 75 6f 74 65 64 54 6f 6b      setQuotedTok
b680: 65 6e 28 70 50 61 72 73 65 2c 20 26 70 4c 65 66  en(pParse, &pLef
b690: 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61  t->token, zTabNa
b6a0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
b6b0: 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 45 78     setToken(&pEx
b6c0: 70 72 2d 3e 73 70 61 6e 2c 20 0a 20 20 20 20 20  pr->span, .     
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
b6e0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
b6f0: 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d  "%s.%s", zTabNam
b700: 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  e, zName));.    
b710: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
b720: 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20  >span.dyn = 1;. 
b730: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
b740: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b  pr->token.z = 0;
b750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
b760: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  Expr->token.n = 
b770: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
b780: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79   pExpr->token.dy
b790: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
b7a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b7b0: 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
b7c0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
b7d0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
b7e0: 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  n = pExpr->token
b7f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
b800: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20  pExpr->span.dyn 
b810: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
b820: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
b830: 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a  f( longNames ){.
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
b850: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
b860: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
b870: 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20  e, pNew, pExpr, 
b880: 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20  &pExpr->span);. 
b890: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
b8a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b8b0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
b8c0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
b8d0: 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72  rse, pNew, pExpr
b8e0: 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  , &pRight->token
b8f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
b900: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b910: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
b920: 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b  f( !tableSeen ){
b930: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
b940: 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  TName ){.       
b950: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
b960: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
b970: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
b980: 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  , zTName);.     
b990: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b9a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b9b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
b9c0: 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
b9d0: 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  fied");.        
b9e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
b9f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
ba00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ba10: 66 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20  free(zTName);.  
ba20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ba30: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
ba40: 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20  elete(pEList);. 
ba50: 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
ba60: 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  New;.  }.  if( p
ba70: 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70  ->pEList && p->p
ba80: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 53 51 4c  EList->nExpr>SQL
ba90: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29  ITE_MAX_COLUMN )
baa0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
bab0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
bac0: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
bad0: 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b  in result set");
bae0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
baf0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
bb00: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
bb10: 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ed ){.    rc = S
bb20: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
bb30: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
bb40: 0a 2f 2a 0a 2a 2a 20 70 45 20 69 73 20 61 20 70  ./*.** pE is a p
bb50: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 65 78 70  ointer to an exp
bb60: 72 65 73 73 69 6f 6e 20 77 68 69 63 68 20 69 73  ression which is
bb70: 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 69   a single term i
bb80: 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72  n.** ORDER BY or
bb90: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
bba0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 20 65 76  ..**.** If pE ev
bbb0: 61 6c 75 61 74 65 73 20 74 6f 20 61 6e 20 69 6e  aluates to an in
bbc0: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 69  teger constant i
bbd0: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 69 2e  , then return i.
bbe0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69  .** This is an i
bbf0: 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 74 68 65  ndication to the
bc00: 20 63 61 6c 6c 65 72 20 74 68 61 74 20 69 74 20   caller that it 
bc10: 73 68 6f 75 6c 64 20 73 6f 72 74 0a 2a 2a 20 62  should sort.** b
bc20: 79 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d  y the i-th colum
bc30: 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  n of the result 
bc40: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  set..**.** If pE
bc50: 20 69 73 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   is a well-forme
bc60: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  d expression and
bc70: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
bc80: 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 74 20  ement.** is not 
bc90: 63 6f 6d 70 6f 75 6e 64 2c 20 74 68 65 6e 20 72  compound, then r
bca0: 65 74 75 72 6e 20 30 2e 20 20 54 68 69 73 20 69  eturn 0.  This i
bcb0: 6e 64 69 63 61 74 65 73 20 74 6f 20 74 68 65 0a  ndicates to the.
bcc0: 2a 2a 20 63 61 6c 6c 65 72 20 74 68 61 74 20 69  ** caller that i
bcd0: 74 20 73 68 6f 75 6c 64 20 73 6f 72 74 20 62 79  t should sort by
bce0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
bcf0: 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 65 78  e ORDER BY.** ex
bd00: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
bd10: 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73  If the SELECT is
bd20: 20 63 6f 6d 70 6f 75 6e 64 2c 20 74 68 65 6e 20   compound, then 
bd30: 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 74 63 68  attempt to match
bd40: 20 70 45 20 61 67 61 69 6e 73 74 0a 2a 2a 20 72   pE against.** r
bd50: 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e  esult set column
bd60: 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f  s in the left-mo
bd70: 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
bd80: 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ent.  Return.** 
bd90: 74 68 65 20 69 6e 64 65 78 20 69 20 6f 66 20 74  the index i of t
bda0: 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  he matching colu
bdb0: 6d 6e 2c 20 61 73 20 61 6e 20 69 6e 64 69 63 61  mn, as an indica
bdc0: 74 69 6f 6e 20 74 6f 20 74 68 65 20 0a 2a 2a 20  tion to the .** 
bdd0: 63 61 6c 6c 65 72 20 74 68 61 74 20 69 74 20 73  caller that it s
bde0: 68 6f 75 6c 64 20 73 6f 72 74 20 62 79 20 74 68  hould sort by th
bdf0: 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 2e 20 20  e i-th column.  
be00: 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  If there is.** n
be10: 6f 20 6d 61 74 63 68 2c 20 72 65 74 75 72 6e 20  o match, return 
be20: 2d 31 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20  -1 and leave an 
be30: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
be40: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 73 74 61 74   pParse..*/.stat
be50: 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65  ic int matchOrde
be60: 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73  rByTermToExprLis
be70: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
be80: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
be90: 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 65  ng context for e
bea0: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f  rror messages */
beb0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
bec0: 63 74 2c 20 20 20 2f 2a 20 54 68 65 20 53 45 4c  ct,   /* The SEL
bed0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 77 69  ECT statement wi
bee0: 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
bef0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
bf00: 20 2a 70 45 2c 20 20 20 20 20 20 20 20 20 20 2f   *pE,          /
bf10: 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20 4f  * The specific O
bf20: 52 44 45 52 20 42 59 20 74 65 72 6d 20 2a 2f 0a  RDER BY term */.
bf30: 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20    int idx,      
bf40: 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 4f 52 44       /* When ORD
bf50: 45 52 20 42 59 20 74 65 72 6d 20 69 73 20 74 68  ER BY term is th
bf60: 69 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  is */.  int isCo
bf70: 6d 70 6f 75 6e 64 2c 20 20 20 20 2f 2a 20 54 72  mpound,    /* Tr
bf80: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
bf90: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
bfa0: 2a 2f 0a 20 20 75 38 20 2a 70 48 61 73 41 67 67  */.  u8 *pHasAgg
bfb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
bfc0: 69 66 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  if expression co
bfd0: 6e 74 61 69 6e 73 20 61 67 67 72 65 67 61 74 65  ntains aggregate
bfe0: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
bff0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
c000: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
c010: 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c  unter */.  ExprL
c020: 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 2f 2a  ist *pEList;  /*
c030: 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   The columns of 
c040: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
c050: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
c060: 6e 63 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63  nc;    /* Name c
c070: 6f 6e 74 65 78 74 20 66 6f 72 20 72 65 73 6f 6c  ontext for resol
c080: 76 69 6e 67 20 70 45 20 2a 2f 0a 0a 0a 20 20 2f  ving pE */...  /
c090: 2a 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73  * If the term is
c0a0: 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73   an integer cons
c0b0: 74 61 6e 74 2c 20 72 65 74 75 72 6e 20 74 68 65  tant, return the
c0c0: 20 76 61 6c 75 65 20 6f 66 20 74 68 61 74 0a 20   value of that. 
c0d0: 20 2a 2a 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a   ** constant */.
c0e0: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
c0f0: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66  ct->pEList;.  if
c100: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
c110: 6e 74 65 67 65 72 28 70 45 2c 20 26 69 29 20 29  nteger(pE, &i) )
c120: 7b 0a 20 20 20 20 69 66 28 20 69 3c 3d 30 20 29  {.    if( i<=0 )
c130: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 20  {.      /* If i 
c140: 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 6d 61  is too small, ma
c150: 6b 65 20 69 74 20 74 6f 6f 20 62 69 67 2e 20 20  ke it too big.  
c160: 54 68 61 74 20 77 61 79 20 74 68 65 20 63 61 6c  That way the cal
c170: 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 66 75  ling.      ** fu
c180: 6e 63 74 69 6f 6e 20 73 74 69 6c 6c 20 73 65 65  nction still see
c190: 73 20 61 20 76 61 6c 75 65 20 74 68 61 74 20 69  s a value that i
c1a0: 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2c 20  s out of range, 
c1b0: 62 75 74 20 64 6f 65 73 0a 20 20 20 20 20 20 2a  but does.      *
c1c0: 2a 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 74 68  * not confuse th
c1d0: 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
c1e0: 77 69 74 68 20 30 20 6f 72 20 2d 31 20 72 65 73  with 0 or -1 res
c1f0: 75 6c 74 20 63 6f 64 65 2e 0a 20 20 20 20 20 20  ult code..      
c200: 2a 2f 0a 20 20 20 20 20 20 69 20 3d 20 70 45 4c  */.      i = pEL
c210: 69 73 74 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20 20  ist->nExpr+1;.  
c220: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69    }.    return i
c230: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
c240: 68 65 20 74 65 72 6d 20 69 73 20 61 20 73 69 6d  he term is a sim
c250: 70 6c 65 20 69 64 65 6e 74 69 66 69 65 72 20 74  ple identifier t
c260: 68 61 74 20 74 72 79 20 74 6f 20 6d 61 74 63 68  hat try to match
c270: 20 74 68 61 74 20 69 64 65 6e 74 69 66 69 65 72   that identifier
c280: 0a 20 20 2a 2a 20 61 67 61 69 6e 73 74 20 61 20  .  ** against a 
c290: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 6e 20 74  column name in t
c2a0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20  he result set.. 
c2b0: 20 2a 2f 0a 20 20 69 66 28 20 70 45 2d 3e 6f 70   */.  if( pE->op
c2c0: 3d 3d 54 4b 5f 49 44 20 7c 7c 20 28 70 45 2d 3e  ==TK_ID || (pE->
c2d0: 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 26 26  op==TK_STRING &&
c2e0: 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21   pE->token.z[0]!
c2f0: 3d 27 5c 27 27 29 20 29 7b 0a 20 20 20 20 73 71  ='\'') ){.    sq
c300: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c310: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 63 68 61 72  se->db;.    char
c320: 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33   *zCol = sqlite3
c330: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
c340: 2c 20 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  , &pE->token);. 
c350: 20 20 20 69 66 28 20 7a 43 6f 6c 3d 3d 30 20 29     if( zCol==0 )
c360: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  {.      return -
c370: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  1;.    }.    for
c380: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
c390: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
c3a0: 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70     char *zAs = p
c3b0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
c3c0: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 73  e;.      if( zAs
c3d0: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
c3e0: 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29  rICmp(zAs, zCol)
c3f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
c400: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c  qlite3_free(zCol
c410: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
c420: 6e 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20  n i+1;.      }. 
c430: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
c440: 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 7d  _free(zCol);.  }
c450: 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 61  ..  /* Resolve a
c460: 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20  ll names in the 
c470: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 65 78  ORDER BY term ex
c480: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2f 0a 20 20  pression.  */.  
c490: 6d 65 6d 73 65 74 28 26 6e 63 2c 20 30 2c 20 73  memset(&nc, 0, s
c4a0: 69 7a 65 6f 66 28 6e 63 29 29 3b 0a 20 20 6e 63  izeof(nc));.  nc
c4b0: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
c4c0: 3b 0a 20 20 6e 63 2e 70 53 72 63 4c 69 73 74 20  ;.  nc.pSrcList 
c4d0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
c4e0: 0a 20 20 6e 63 2e 70 45 4c 69 73 74 20 3d 20 70  .  nc.pEList = p
c4f0: 45 4c 69 73 74 3b 0a 20 20 6e 63 2e 61 6c 6c 6f  EList;.  nc.allo
c500: 77 41 67 67 20 3d 20 31 3b 0a 20 20 6e 63 2e 6e  wAgg = 1;.  nc.n
c510: 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  Err = 0;.  if( s
c520: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
c530: 65 4e 61 6d 65 73 28 26 6e 63 2c 20 70 45 29 20  eNames(&nc, pE) 
c540: 29 7b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d  ){.    if( isCom
c550: 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 20 20 73  pound ){.      s
c560: 71 6c 69 74 65 33 45 72 72 6f 72 43 6c 65 61 72  qlite3ErrorClear
c570: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
c580: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
c590: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
c5a0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n -1;.    }.  }.
c5b0: 20 20 69 66 28 20 6e 63 2e 68 61 73 41 67 67 20    if( nc.hasAgg 
c5c0: 26 26 20 70 48 61 73 41 67 67 20 29 7b 0a 20 20  && pHasAgg ){.  
c5d0: 20 20 2a 70 48 61 73 41 67 67 20 3d 20 31 3b 0a    *pHasAgg = 1;.
c5e0: 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20    }..  /* For a 
c5f0: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c  compound SELECT,
c600: 20 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20   we need to try 
c610: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 4f 52 44  to match the ORD
c620: 45 52 20 42 59 0a 20 20 2a 2a 20 65 78 70 72 65  ER BY.  ** expre
c630: 73 73 69 6f 6e 20 61 67 61 69 6e 73 74 20 61 6e  ssion against an
c640: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
c650: 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 20 20  he result set.  
c660: 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f 6d 70 6f  */.  if( isCompo
c670: 75 6e 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  und ){.    for(i
c680: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
c690: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
c6a0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
c6b0: 43 6f 6d 70 61 72 65 28 70 45 4c 69 73 74 2d 3e  Compare(pEList->
c6c0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45 29 20  a[i].pExpr, pE) 
c6d0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
c6e0: 6e 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20  n i+1;.      }. 
c6f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
c700: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  n 0;.}.../*.** A
c710: 6e 61 6c 79 7a 65 20 61 6e 64 20 4f 52 44 45 52  nalyze and ORDER
c720: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
c730: 63 6c 61 75 73 65 20 69 6e 20 61 20 73 69 6d 70  clause in a simp
c740: 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  le SELECT statem
c750: 65 6e 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ent..** Return t
c760: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
c770: 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20  ors seen..**.** 
c780: 45 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  Every term of th
c790: 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  e ORDER BY or GR
c7a0: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 6e 65  OUP BY clause ne
c7b0: 65 64 73 20 74 6f 20 62 65 20 61 6e 0a 2a 2a 20  eds to be an.** 
c7c0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 66 20  expression.  If 
c7d0: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  any expression i
c7e0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  s an integer con
c7f0: 73 74 61 6e 74 2c 20 74 68 65 6e 0a 2a 2a 20 74  stant, then.** t
c800: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  hat expression i
c810: 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68  s replaced by th
c820: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
c830: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 66  .** expression f
c840: 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73  rom the result s
c850: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
c860: 74 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72  t processOrderGr
c870: 6f 75 70 42 79 28 0a 20 20 50 61 72 73 65 20 2a  oupBy(.  Parse *
c880: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
c890: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
c8a0: 74 2e 20 20 4c 65 61 76 65 20 65 72 72 6f 72 20  t.  Leave error 
c8b0: 6d 65 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f  messages here */
c8c0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
c8d0: 63 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ct,      /* The 
c8e0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
c8f0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
c900: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
c910: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
c920: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
c930: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
c940: 61 75 73 65 20 74 6f 20 62 65 20 70 72 6f 63 65  ause to be proce
c950: 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ssed */.  int is
c960: 4f 72 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  Order,          
c970: 2f 2a 20 31 20 66 6f 72 20 4f 52 44 45 52 20 42  /* 1 for ORDER B
c980: 59 2e 20 20 30 20 66 6f 72 20 47 52 4f 55 50 20  Y.  0 for GROUP 
c990: 42 59 20 2a 2f 0a 20 20 75 38 20 2a 70 48 61 73  BY */.  u8 *pHas
c9a0: 41 67 67 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Agg           /*
c9b0: 20 53 65 74 20 74 6f 20 54 52 55 45 20 69 66 20   Set to TRUE if 
c9c0: 61 6e 79 20 74 65 72 6d 20 63 6f 6e 74 61 69 6e  any term contain
c9d0: 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a  s an aggregate *
c9e0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
c9f0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
ca00: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
ca10: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20  List *pEList;.. 
ca20: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
ca30: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
ca40: 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  f( pOrderBy->nEx
ca50: 70 72 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  pr>SQLITE_MAX_CO
ca60: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 63 6f 6e 73  LUMN ){.    cons
ca70: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
ca80: 69 73 4f 72 64 65 72 20 3f 20 22 4f 52 44 45 52  isOrder ? "ORDER
ca90: 22 20 3a 20 22 47 52 4f 55 50 22 3b 0a 20 20 20  " : "GROUP";.   
caa0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
cab0: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
cac0: 6e 79 20 74 65 72 6d 73 20 69 6e 20 25 73 20 42  ny terms in %s B
cad0: 59 20 63 6c 61 75 73 65 22 2c 20 7a 54 79 70 65  Y clause", zType
cae0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
caf0: 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20  .  }.  pEList = 
cb00: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
cb10: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
cb20: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
cb30: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
cb40: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
cb50: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  pr; i++){.    in
cb60: 74 20 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72  t iCol;.    Expr
cb70: 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d   *pE = pOrderBy-
cb80: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
cb90: 20 69 43 6f 6c 20 3d 20 6d 61 74 63 68 4f 72 64   iCol = matchOrd
cba0: 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69  erByTermToExprLi
cbb0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
cbc0: 63 74 2c 20 70 45 2c 20 69 2b 31 2c 20 30 2c 20  ct, pE, i+1, 0, 
cbd0: 70 48 61 73 41 67 67 29 3b 0a 20 20 20 20 69 66  pHasAgg);.    if
cbe0: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
cbf0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
cc00: 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 70  }.    if( iCol>p
cc10: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
cc20: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
cc30: 20 2a 7a 54 79 70 65 20 3d 20 69 73 4f 72 64 65   *zType = isOrde
cc40: 72 20 3f 20 22 4f 52 44 45 52 22 20 3a 20 22 47  r ? "ORDER" : "G
cc50: 52 4f 55 50 22 3b 0a 20 20 20 20 20 20 73 71 6c  ROUP";.      sql
cc60: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
cc70: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 22  rse, .         "
cc80: 25 72 20 25 73 20 42 59 20 74 65 72 6d 20 6f 75  %r %s BY term ou
cc90: 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f  t of range - sho
cca0: 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20  uld be ".       
ccb0: 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64    "between 1 and
ccc0: 20 25 64 22 2c 20 69 2b 31 2c 20 7a 54 79 70 65   %d", i+1, zType
ccd0: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
cce0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
ccf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
cd00: 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20  iCol>0 ){.      
cd10: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
cd20: 20 70 45 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20   pE->pColl;.    
cd30: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 45    int flags = pE
cd40: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
cd50: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 73  Collate;.      s
cd60: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
cd70: 28 70 45 29 3b 0a 20 20 20 20 20 20 70 45 20 3d  (pE);.      pE =
cd80: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
cd90: 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 43  db, pEList->a[iC
cda0: 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  ol-1].pExpr);.  
cdb0: 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
cdc0: 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 3b 0a 20  i].pExpr = pE;. 
cdd0: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26       if( pColl &
cde0: 26 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 20  & flags ){.     
cdf0: 20 20 20 70 45 2d 3e 70 43 6f 6c 6c 20 3d 20 70     pE->pColl = p
ce00: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 45  Coll;.        pE
ce10: 2d 3e 66 6c 61 67 73 20 7c 3d 20 66 6c 61 67 73  ->flags |= flags
ce20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ce30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
ce40: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
ce50: 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 6f 72   and ORDER BY or
ce60: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
ce70: 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61   in a SELECT sta
ce80: 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a  tement.  Return.
ce90: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
cea0: 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a   errors seen..**
ceb0: 0a 2a 2a 20 54 68 65 20 70 72 6f 63 65 73 73 69  .** The processi
cec0: 6e 67 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  ng depends on wh
ced0: 65 74 68 65 72 20 74 68 65 20 53 45 4c 45 43 54  ether the SELECT
cee0: 20 69 73 20 73 69 6d 70 6c 65 20 6f 72 20 63 6f   is simple or co
cef0: 6d 70 6f 75 6e 64 2e 0a 2a 2a 20 46 6f 72 20 61  mpound..** For a
cf00: 20 73 69 6d 70 6c 65 20 53 45 4c 45 43 54 20 73   simple SELECT s
cf10: 74 61 74 65 6d 65 6e 74 2c 20 65 76 72 79 20 74  tatement, evry t
cf20: 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52  erm of the ORDER
cf30: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 0a   BY or GROUP BY.
cf40: 2a 2a 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20  ** clause needs 
cf50: 74 6f 20 62 65 20 61 6e 20 65 78 70 72 65 73 73  to be an express
cf60: 69 6f 6e 2e 20 20 49 66 20 61 6e 79 20 65 78 70  ion.  If any exp
cf70: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e  ression is an in
cf80: 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e  teger.** constan
cf90: 74 2c 20 74 68 65 6e 20 74 68 61 74 20 65 78 70  t, then that exp
cfa0: 72 65 73 73 69 6f 6e 20 69 73 20 72 65 70 6c 61  ression is repla
cfb0: 63 65 64 20 62 79 20 74 68 65 20 63 6f 72 72 65  ced by the corre
cfc0: 73 70 6f 6e 64 69 6e 67 20 0a 2a 2a 20 65 78 70  sponding .** exp
cfd0: 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
cfe0: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a   result set..**.
cff0: 2a 2a 20 46 6f 72 20 63 6f 6d 70 6f 75 6e 64 20  ** For compound 
d000: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d010: 73 2c 20 65 76 65 72 79 20 65 78 70 72 65 73 73  s, every express
d020: 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ion needs to be 
d030: 6f 66 0a 2a 2a 20 74 79 70 65 20 54 4b 5f 43 4f  of.** type TK_CO
d040: 4c 55 4d 4e 20 77 69 74 68 20 61 20 69 54 61 62  LUMN with a iTab
d050: 6c 65 20 76 61 6c 75 65 20 61 73 20 67 69 76 65  le value as give
d060: 6e 20 69 6e 20 74 68 65 20 34 74 68 20 70 61 72  n in the 4th par
d070: 61 6d 65 74 65 72 2e 0a 2a 2a 20 49 66 20 61 6e  ameter..** If an
d080: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  y expression is 
d090: 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 61 74  an integer, that
d0a0: 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6c   becomes the col
d0b0: 75 6d 6e 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 4f  umn number..** O
d0c0: 74 68 65 72 77 69 73 65 2c 20 6d 61 74 63 68 20  therwise, match 
d0d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
d0e0: 67 61 69 6e 73 74 20 72 65 73 75 6c 74 20 73 65  gainst result se
d0f0: 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 2a  t columns from.*
d100: 2a 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * the left-most 
d110: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 73 74 61 74 69  SELECT..*/.stati
d120: 63 20 69 6e 74 20 70 72 6f 63 65 73 73 43 6f 6d  c int processCom
d130: 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 0a 20 20  poundOrderBy(.  
d140: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
d150: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
d160: 20 63 6f 6e 74 65 78 74 2e 20 20 4c 65 61 76 65   context.  Leave
d170: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
d180: 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  here */.  Select
d190: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
d1a0: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
d1b0: 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69  atement containi
d1c0: 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ng the ORDER BY 
d1d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 20  */.  int iTable 
d1e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
d1f0: 74 70 75 74 20 74 61 62 6c 65 20 66 6f 72 20 63  tput table for c
d200: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
d210: 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  tatements */.){.
d220: 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c    int i;.  ExprL
d230: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20  ist *pOrderBy;. 
d240: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
d250: 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
d260: 3b 0a 20 20 69 6e 74 20 6d 6f 72 65 54 6f 44 6f  ;.  int moreToDo
d270: 20 3d 20 31 3b 0a 0a 20 20 70 4f 72 64 65 72 42   = 1;..  pOrderB
d280: 79 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72  y = pSelect->pOr
d290: 64 65 72 42 79 3b 0a 20 20 69 66 28 20 70 4f 72  derBy;.  if( pOr
d2a0: 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
d2b0: 6e 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  n 0;.  if( pOrde
d2c0: 72 42 79 2d 3e 6e 45 78 70 72 3e 53 51 4c 49 54  rBy->nExpr>SQLIT
d2d0: 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  E_MAX_COLUMN ){.
d2e0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d2f0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
d300: 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 4f   many terms in O
d310: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 22 29  RDER BY clause")
d320: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
d330: 20 20 7d 0a 20 20 64 62 20 3d 20 70 50 61 72 73    }.  db = pPars
d340: 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d 30  e->db;.  for(i=0
d350: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
d360: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  xpr; i++){.    p
d370: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f  OrderBy->a[i].do
d380: 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 77 68  ne = 0;.  }.  wh
d390: 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50  ile( pSelect->pP
d3a0: 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 53 65 6c  rior ){.    pSel
d3b0: 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ect = pSelect->p
d3c0: 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 77 68 69  Prior;.  }.  whi
d3d0: 6c 65 28 20 70 53 65 6c 65 63 74 20 26 26 20 6d  le( pSelect && m
d3e0: 6f 72 65 54 6f 44 6f 20 29 7b 0a 20 20 20 20 6d  oreToDo ){.    m
d3f0: 6f 72 65 54 6f 44 6f 20 3d 20 30 3b 0a 20 20 20  oreToDo = 0;.   
d400: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
d410: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
d420: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
d430: 6c 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  l;.      Expr *p
d440: 45 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20  E, *pDup;.      
d450: 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  if( pOrderBy->a[
d460: 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e  i].done ) contin
d470: 75 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70  ue;.      pE = p
d480: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
d490: 78 70 72 3b 0a 20 20 20 20 20 20 70 44 75 70 20  xpr;.      pDup 
d4a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
d4b0: 28 64 62 2c 20 70 45 29 3b 0a 20 20 20 20 20 20  (db, pE);.      
d4c0: 69 66 28 20 70 44 75 70 3d 3d 30 20 29 7b 0a 20  if( pDup==0 ){. 
d4d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
d4e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d4f0: 43 6f 6c 20 3d 20 6d 61 74 63 68 4f 72 64 65 72  Col = matchOrder
d500: 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 74  ByTermToExprList
d510: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
d520: 2c 20 70 44 75 70 2c 20 69 2b 31 2c 20 31 2c 20  , pDup, i+1, 1, 
d530: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
d540: 33 45 78 70 72 44 65 6c 65 74 65 28 70 44 75 70  3ExprDelete(pDup
d550: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
d560: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  l<0 ){.        r
d570: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
d580: 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
d590: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
d5a0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73  .      if( pELis
d5b0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
d5c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
d5d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  }.      if( iCol
d5e0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
d5f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
d600: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d610: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 25  , .           "%
d620: 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  r ORDER BY term 
d630: 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73  out of range - s
d640: 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20  hould be ".     
d650: 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31        "between 1
d660: 20 61 6e 64 20 25 64 22 2c 20 69 2b 31 2c 20 70   and %d", i+1, p
d670: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
d680: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
d690: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d6a0: 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20  f( iCol>0 ){.   
d6b0: 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b       pE->op = TK
d6c0: 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
d6d0: 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54   pE->iTable = iT
d6e0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 45  able;.        pE
d6f0: 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20  ->iAgg = -1;.   
d700: 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
d710: 20 3d 20 69 43 6f 6c 2d 31 3b 0a 20 20 20 20 20   = iCol-1;.     
d720: 20 20 20 70 45 2d 3e 70 54 61 62 20 3d 20 30 3b     pE->pTab = 0;
d730: 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
d740: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31  y->a[i].done = 1
d750: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d760: 20 20 20 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20         moreToDo 
d770: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
d780: 20 7d 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d   }.    pSelect =
d790: 20 70 53 65 6c 65 63 74 2d 3e 70 4e 65 78 74 3b   pSelect->pNext;
d7a0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
d7b0: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
d7c0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
d7d0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
d7e0: 64 6f 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  done==0 ){.     
d7f0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
d800: 28 70 50 61 72 73 65 2c 20 22 25 72 20 4f 52 44  (pParse, "%r ORD
d810: 45 52 20 42 59 20 74 65 72 6d 20 64 6f 65 73 20  ER BY term does 
d820: 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 22 0a  not match any ".
d830: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c              "col
d840: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
d850: 74 20 73 65 74 22 2c 20 69 2b 31 29 3b 0a 20 20  t set", i+1);.  
d860: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
d870: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
d880: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74   0;.}../*.** Get
d890: 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20   a VDBE for the 
d8a0: 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e  given parser con
d8b0: 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20  text.  Create a 
d8c0: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
d8d0: 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65  sary..** If an e
d8e0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
d8f0: 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61  urn NULL and lea
d900: 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  ve a message in 
d910: 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20  pParse..*/.Vdbe 
d920: 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28  *sqlite3GetVdbe(
d930: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
d940: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
d950: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
d960: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d   v==0 ){.    v =
d970: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d   pParse->pVdbe =
d980: 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
d990: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  te(pParse->db);.
d9a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a    }.  return v;.
d9b0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  }.../*.** Comput
d9c0: 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64  e the iLimit and
d9d0: 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20   iOffset fields 
d9e0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61  of the SELECT ba
d9f0: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c  sed on the.** pL
da00: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
da10: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70   expressions.  p
da20: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
da30: 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  t hold the expre
da40: 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61  ssions.** that a
da50: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69  ppear in the ori
da60: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
da70: 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49  ent after the LI
da80: 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a  MIT and OFFSET.*
da90: 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20  * keywords.  Or 
daa0: 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65  NULL if those ke
dab0: 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74  ywords are omitt
dac0: 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  ed. iLimit and i
dad0: 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74  Offset .** are t
dae0: 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72  he integer memor
daf0: 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  y register numbe
db00: 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20  rs for counters 
db10: 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
db20: 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e  .** the limit an
db30: 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68  d offset.  If th
db40: 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20  ere is no limit 
db50: 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74  and/or offset, t
db60: 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61  hen .** iLimit a
db70: 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e  nd iOffset are n
db80: 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  egative..**.** T
db90: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e  his routine chan
dba0: 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ges the values o
dbb0: 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  f iLimit and iOf
dbc0: 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20  fset only if.** 
dbd0: 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65  a limit or offse
dbe0: 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
dbf0: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
dc00: 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a  et.  iLimit and.
dc10: 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c  ** iOffset shoul
dc20: 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73  d have been pres
dc30: 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74  et to appropriat
dc40: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  e default values
dc50: 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74  .** (usually but
dc60: 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20   not always -1) 
dc70: 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
dc80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
dc90: 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74  * Only if pLimit
dca0: 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d  !=0 or pOffset!=
dcb0: 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72  0 do the limit r
dcc0: 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20  egisters get.** 
dcd0: 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20  redefined.  The 
dce0: 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
dcf0: 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f  or uses this pro
dd00: 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a  perty to force.*
dd10: 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74  * the reuse of t
dd20: 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e  he same limit an
dd30: 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65  d offset registe
dd40: 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70  rs across multip
dd50: 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  le.** SELECT sta
dd60: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
dd70: 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c  ic void computeL
dd80: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61  imitRegisters(Pa
dd90: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
dda0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65  ect *p, int iBre
ddb0: 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ak){.  Vdbe *v =
ddc0: 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74   0;.  int iLimit
ddd0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66   = 0;.  int iOff
dde0: 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31  set;.  int addr1
ddf0: 2c 20 61 64 64 72 32 3b 0a 0a 20 20 2f 2a 20 0a  , addr2;..  /* .
de00: 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20    ** "LIMIT -1" 
de10: 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c  always shows all
de20: 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73   rows.  There is
de30: 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72   some.  ** contr
de40: 61 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61  aversy about wha
de50: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  t the correct be
de60: 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65  havior should be
de70: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65  ..  ** The curre
de80: 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
de90: 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49  n interprets "LI
dea0: 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20  MIT 0" to mean. 
deb0: 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a   ** no rows..  *
dec0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  /.  if( p->pLimi
ded0: 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d  t ){.    p->iLim
dee0: 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b  it = iLimit = ++
def0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
df00: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b    pParse->nMem++
df10: 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ;.    v = sqlite
df20: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
df30: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
df40: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
df50: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
df60: 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  rse, p->pLimit, 
df70: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
df80: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
df90: 4d 75 73 74 42 65 49 6e 74 29 3b 0a 20 20 20 20  MustBeInt);.    
dfa0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dfb0: 32 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 30 2c  2(v, OP_Move, 0,
dfc0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 56 64   iLimit);.    Vd
dfd0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
dfe0: 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
dff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e000: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a  AddOp2(v, OP_IfZ
e010: 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72  ero, iLimit, iBr
e020: 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eak);.    sqlite
e030: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e040: 50 5f 53 43 6f 70 79 2c 20 69 4c 69 6d 69 74 2c  P_SCopy, iLimit,
e050: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   0);.  }.  if( p
e060: 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
e070: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f   p->iOffset = iO
e080: 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  ffset = ++pParse
e090: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20  ->nMem;.    v = 
e0a0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
e0b0: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
e0c0: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
e0d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
e0e0: 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f  de(pParse, p->pO
e0f0: 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 73  ffset, 0);.    s
e100: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
e110: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
e120: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
e130: 62 65 41 64 64 4f 70 32 28 76 2c 20 70 2d 3e 70  beAddOp2(v, p->p
e140: 4c 69 6d 69 74 3d 3d 30 20 3f 20 4f 50 5f 4d 6f  Limit==0 ? OP_Mo
e150: 76 65 20 3a 20 4f 50 5f 43 6f 70 79 2c 20 30 2c  ve : OP_Copy, 0,
e160: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 56   iOffset);.    V
e170: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
e180: 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
e190: 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73  );.    addr1 = s
e1a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
e1b0: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f  (v, OP_IfPos, iO
e1c0: 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  ffset);.    sqli
e1d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e1e0: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
e1f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e200: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
e210: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
e220: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
e230: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
e240: 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74     if( p->pLimit
e250: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e260: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e270: 50 5f 41 64 64 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Add, 0, 0);.  
e280: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
e290: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 61  >pLimit ){.    a
e2a0: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
e2b0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
e2c0: 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  fPos, iLimit);. 
e2d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e2e0: 64 4f 70 31 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  dOp1(v, OP_Pop, 
e2f0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
e300: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e310: 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4c 69  Integer, -1, iLi
e320: 6d 69 74 2b 31 29 3b 0a 20 20 20 20 61 64 64 72  mit+1);.    addr
e330: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
e340: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
e350: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
e360: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
e370: 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr1);.    sqlite
e380: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e390: 50 5f 4d 6f 76 65 2c 20 30 2c 20 69 4c 69 6d 69  P_Move, 0, iLimi
e3a0: 74 2b 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  t+1);.    VdbeCo
e3b0: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
e3c0: 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20  +OFFSET"));.    
e3d0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
e3e0: 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20  ere(v, addr2);. 
e3f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
e400: 63 61 74 65 20 61 20 76 69 72 74 75 61 6c 20 69  cate a virtual i
e410: 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
e420: 73 6f 72 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  sorting..*/.stat
e430: 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 53 6f  ic void createSo
e440: 72 74 69 6e 67 49 6e 64 65 78 28 50 61 72 73 65  rtingIndex(Parse
e450: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
e460: 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70   *p, ExprList *p
e470: 4f 72 64 65 72 42 79 29 7b 0a 20 20 69 66 28 20  OrderBy){.  if( 
e480: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
e490: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 61 73  int addr;.    as
e4a0: 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e  sert( pOrderBy->
e4b0: 69 45 43 75 72 73 6f 72 3d 3d 30 20 29 3b 0a 20  iECursor==0 );. 
e4c0: 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43     pOrderBy->iEC
e4d0: 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
e4e0: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 61 64 64 72  nTab++;.    addr
e4f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
e500: 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
e510: 62 65 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  be, OP_OpenEphem
e520: 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e540: 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
e550: 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e  rsor, pOrderBy->
e560: 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20 20 61 73  nExpr+1);.    as
e570: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
e580: 6e 45 70 68 6d 5b 32 5d 20 3d 3d 20 2d 31 20 29  nEphm[2] == -1 )
e590: 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  ;.    p->addrOpe
e5a0: 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 3b  nEphm[2] = addr;
e5b0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
e5c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
e5d0: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
e5e0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
e5f0: 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
e600: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
e610: 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
e620: 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73  mn of.** the res
e630: 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20  ult set for the 
e640: 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
e650: 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20  statement "p".  
e660: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a  Return NULL if.*
e670: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  * the column has
e680: 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c   no default coll
e690: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
e6a0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
e6b0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
e6c0: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
e6d0: 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72  lect is taken fr
e6e0: 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  om the.** left-m
e6f0: 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ost term of the 
e700: 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20  select that has 
e710: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
e720: 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
e730: 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65  CollSeq *multiSe
e740: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73  lectCollSeq(Pars
e750: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
e760: 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  t *p, int iCol){
e770: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74  .  CollSeq *pRet
e780: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
e790: 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
e7a0: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
e7b0: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50  eq(pParse, p->pP
e7c0: 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d  rior, iCol);.  }
e7d0: 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d  else{.    pRet =
e7e0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52   0;.  }.  if( pR
e7f0: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52 65  et==0 ){.    pRe
e800: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
e810: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
e820: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
e830: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  ].pExpr);.  }.  
e840: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23  return pRet;.}.#
e850: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
e860: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
e870: 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  LECT */..#ifndef
e880: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
e890: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
e8a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e8b0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
e8c0: 63 65 73 73 20 61 20 71 75 65 72 79 20 74 68 61  cess a query tha
e8d0: 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  t is really the 
e8e0: 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65  union.** or inte
e8f0: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  rsection of two 
e900: 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65  or more separate
e910: 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20   queries..**.** 
e920: 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  "p" points to th
e930: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
e940: 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e  the two queries.
e950: 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74    the query on t
e960: 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d  he.** left is p-
e970: 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65  >pPrior.  The le
e980: 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61  ft query could a
e990: 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  lso be a compoun
e9a0: 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68  d query.** in wh
e9b0: 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f  ich case this ro
e9c0: 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
e9d0: 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
e9e0: 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  . .**.** The res
e9f0: 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61  ults of the tota
ea00: 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62  l query are to b
ea10: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  e written into a
ea20: 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20   destination.** 
ea30: 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69  of type eDest wi
ea40: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61  th parameter iPa
ea50: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  rm..**.** Exampl
ea60: 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61  e 1:  Consider a
ea70: 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f   three-way compo
ea80: 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  und SQL statemen
ea90: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  t..**.**     SEL
eaa0: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e  ECT a FROM t1 UN
eab0: 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
eac0: 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
ead0: 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a  T c FROM t3.**.*
eae0: 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
eaf0: 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73   is parsed up as
eb00: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
eb10: 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
eb20: 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a  M t3.**      |.*
eb30: 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20  *      `----->  
eb40: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
eb50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
eb60: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
eb70: 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20         `------> 
eb80: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
eb90: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f  1.**.** The arro
eba0: 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  ws in the diagra
ebb0: 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e  m above represen
ebc0: 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72  t the Select.pPr
ebd0: 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  ior pointer..** 
ebe0: 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
ebf0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
ec00: 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65  h p equal to the
ec10: 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a   t3 query, then.
ec20: 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62  ** pPrior will b
ec30: 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20  e the t2 query. 
ec40: 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54   p->op will be T
ec50: 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20  K_UNION in this 
ec60: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69  case..**.** Noti
ec70: 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  ce that because 
ec80: 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74  of the way SQLit
ec90: 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e  e parses compoun
eca0: 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a  d SELECTs, the.*
ecb0: 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  * individual sel
ecc0: 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75  ects always grou
ecd0: 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  p from left to r
ece0: 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
ecf0: 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
ed00: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ed10: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
ed20: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
ed30: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
ed40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
ed50: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
ed60: 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
ed70: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
ed80: 2a 70 44 65 73 74 2c 20 20 20 20 2f 2a 20 57 68  *pDest,    /* Wh
ed90: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
eda0: 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ery results */. 
edb0: 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20   char *aff      
edc0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65         /* If eDe
edd0: 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c  st is SRT_Union,
ede0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
edf0: 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ring */.){.  int
ee00: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
ee10: 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f     /* Success co
ee20: 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75  de from a subrou
ee30: 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tine */.  Select
ee40: 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
ee50: 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
ee60: 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
ee70: 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
ee80: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
ee90: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
eea0: 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
eeb0: 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  BE */.  int nCol
eec0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
eed0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
eee0: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
eef0: 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69   set */.  ExprLi
ef00: 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
ef10: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
ef20: 63 6c 61 75 73 65 20 6f 6e 20 70 20 2a 2f 0a 20  clause on p */. 
ef30: 20 69 6e 74 20 61 53 65 74 50 32 5b 32 5d 3b 20   int aSetP2[2]; 
ef40: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 50 32         /* Set P2
ef50: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 73 65 20   value of these 
ef60: 6f 70 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20  op to number of 
ef70: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
ef80: 20 6e 53 65 74 50 32 20 3d 20 30 3b 20 20 20 20   nSetP2 = 0;    
ef90: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
efa0: 73 6c 6f 74 73 20 69 6e 20 61 53 65 74 50 32 5b  slots in aSetP2[
efb0: 5d 20 75 73 65 64 20 2a 2f 0a 20 20 53 65 6c 65  ] used */.  Sele
efc0: 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
efd0: 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    /* Alternative
efe0: 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f   data destinatio
eff0: 6e 20 2a 2f 0a 0a 20 20 64 65 73 74 20 3d 20 2a  n */..  dest = *
f000: 70 44 65 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  pDest;..  /* Mak
f010: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
f020: 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  no ORDER BY or L
f030: 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70  IMIT clause on p
f040: 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f  rior SELECTs.  O
f050: 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73  nly.  ** the las
f060: 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53  t (right-most) S
f070: 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
f080: 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
f090: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
f0a0: 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d  T..  */.  if( p=
f0b0: 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d  =0 || p->pPrior=
f0c0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31  =0 ){.    rc = 1
f0d0: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
f0e0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
f0f0: 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
f100: 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
f110: 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d   pPrior->pRightm
f120: 6f 73 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20  ost!=pPrior );. 
f130: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
f140: 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e  >pRightmost==p->
f150: 70 52 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20  pRightmost );.  
f160: 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  if( pPrior->pOrd
f170: 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
f180: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
f190: 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61  se,"ORDER BY cla
f1a0: 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
f1b0: 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
f1c0: 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
f1d0: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
f1e0: 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
f1f0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
f200: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  ect_end;.  }.  i
f210: 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
f220: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
f230: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f240: 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68  "LIMIT clause sh
f250: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
f260: 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
f270: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
f280: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
f290: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
f2a0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
f2b0: 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  d;.  }..  /* Mak
f2c0: 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
f2d0: 20 76 61 6c 69 64 20 71 75 65 72 79 20 65 6e 67   valid query eng
f2e0: 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72  ine.  If not, cr
f2f0: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a  eate a new one..
f300: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
f310: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
f320: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  );.  if( v==0 ){
f330: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
f340: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
f350: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
f360: 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73  * Create the des
f370: 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61  tination tempora
f380: 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65  ry table if nece
f390: 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28  ssary.  */.  if(
f3a0: 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
f3b0: 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
f3c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
f3d0: 73 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  st );.    assert
f3e0: 28 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28  ( nSetP2<sizeof(
f3f0: 61 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61  aSetP2)/sizeof(a
f400: 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20  SetP2[0]) );.   
f410: 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b   aSetP2[nSetP2++
f420: 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  ] = sqlite3VdbeA
f430: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
f440: 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e  Ephemeral, dest.
f450: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 64  iParm, 0);.    d
f460: 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
f470: 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Table;.  }..  /*
f480: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
f490: 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  or the left and 
f4a0: 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61  right SELECT sta
f4b0: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
f4c0: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
f4d0: 72 64 65 72 42 79 3b 0a 20 20 73 77 69 74 63 68  rderBy;.  switch
f4e0: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
f4f0: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20  ase TK_ALL: {.  
f500: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
f510: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
f520: 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20  nt addr = 0;.   
f530: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
f540: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a  rior->pLimit );.
f550: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e          pPrior->
f560: 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
f570: 69 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69  it;.        pPri
f580: 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d  or->pOffset = p-
f590: 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
f5a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
f5b0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
f5c0: 69 6f 72 2c 20 26 64 65 73 74 2c 20 30 2c 20 30  ior, &dest, 0, 0
f5d0: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
f5e0: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
f5f0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 66  ;.        p->pOf
f600: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
f610: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
f620: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
f630: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
f640: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
f650: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
f660: 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
f670: 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74  = pPrior->iLimit
f680: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66  ;.        p->iOf
f690: 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  fset = pPrior->i
f6a0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
f6b0: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30  if( p->iLimit>=0
f6c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64   ){.          ad
f6d0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
f6e0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a  AddOp1(v, OP_IfZ
f6f0: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b  ero, p->iLimit);
f700: 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
f710: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70  omment((v, "Jump
f720: 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20   ahead if LIMIT 
f730: 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20  reached"));.    
f740: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
f750: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
f760: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
f770: 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  t, 0, 0, 0, aff)
f780: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  ;.        p->pPr
f790: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
f7a0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
f7b0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
f7c0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
f7d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f7e0: 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20     if( addr ){. 
f7f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f800: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
f810: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  addr);.        }
f820: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
f830: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
f840: 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e   For UNION ALL .
f850: 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61 6c 6c  .. ORDER BY fall
f860: 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
f870: 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20  next case */.   
f880: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45   }.    case TK_E
f890: 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20  XCEPT:.    case 
f8a0: 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
f8b0: 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20    int unionTab; 
f8c0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
f8d0: 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  ber of the tempo
f8e0: 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69  rary table holdi
f8f0: 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
f900: 20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20     int op = 0;  
f910: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
f920: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
f930: 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65  s to apply to se
f940: 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lf */.      int 
f950: 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
f960: 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
f970: 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
f980: 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
f990: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
f9a0: 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a  it, *pOffset; /*
f9b0: 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66   Saved values of
f9c0: 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70   p->nLimit and p
f9d0: 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ->nOffset */.   
f9e0: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
f9f0: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e     SelectDest un
fa00: 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20  iondest;..      
fa10: 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d  priorOp = p->op=
fa20: 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61  =TK_ALL ? SRT_Ta
fa30: 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b  ble : SRT_Union;
fa40: 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
fa50: 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26  eDest==priorOp &
fa60: 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  & pOrderBy==0 &&
fa70: 20 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 20 21   !p->pLimit && !
fa80: 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
fa90: 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20        /* We can 
faa0: 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72  reuse a temporar
fab0: 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  y table generate
fac0: 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f  d by a SELECT to
fad0: 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   our.        ** 
fae0: 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a  right..        *
faf0: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
fb00: 61 62 20 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b  ab = dest.iParm;
fb10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
fb20: 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
fb30: 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
fb40: 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
fb50: 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
fb60: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
fb70: 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
fb80: 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
fb90: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
fba0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
fbb0: 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  +;.        if( p
fbc0: 72 6f 63 65 73 73 43 6f 6d 70 6f 75 6e 64 4f 72  rocessCompoundOr
fbd0: 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c  derBy(pParse, p,
fbe0: 20 75 6e 69 6f 6e 54 61 62 29 20 29 7b 0a 20 20   unionTab) ){.  
fbf0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
fc00: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
fc10: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
fc20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
fc30: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
fc40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
fc50: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
fc60: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
fc70: 20 20 20 20 20 20 20 69 66 28 20 70 72 69 6f 72         if( prior
fc80: 4f 70 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b  Op==SRT_Table ){
fc90: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
fca0: 74 28 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66  t( nSetP2<sizeof
fcb0: 28 61 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28  (aSetP2)/sizeof(
fcc0: 61 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20  aSetP2[0]) );.  
fcd0: 20 20 20 20 20 20 20 20 61 53 65 74 50 32 5b 6e          aSetP2[n
fce0: 53 65 74 50 32 2b 2b 5d 20 3d 20 61 64 64 72 3b  SetP2++] = addr;
fcf0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
fd00: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
fd10: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
fd20: 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
fd30: 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f          p->addrO
fd40: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
fd50: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  r;.          p->
fd60: 70 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73  pRightmost->uses
fd70: 45 70 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Ephm = 1;.      
fd80: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 72 65 61    }.        crea
fd90: 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70  teSortingIndex(p
fda0: 50 61 72 73 65 2c 20 70 2c 20 70 4f 72 64 65 72  Parse, p, pOrder
fdb0: 42 79 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  By);.        ass
fdc0: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
fdd0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
fde0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
fdf0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
fe00: 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20  o our left.     
fe10: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
fe20: 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  ( !pPrior->pOrde
fe30: 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  rBy );.      sql
fe40: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
fe50: 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70  it(&uniondest, p
fe60: 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
fe70: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
fe80: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
fe90: 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69  se, pPrior, &uni
fea0: 6f 6e 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c  ondest, 0, 0, 0,
feb0: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28   aff);.      if(
fec0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
fed0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
fee0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
fef0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
ff00: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
ff10: 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
ff20: 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  */.      switch(
ff30: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20   p->op ){.      
ff40: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
ff50: 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63  T:  op = SRT_Exc
ff60: 65 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  ept;   break;.  
ff70: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55         case TK_U
ff80: 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54  NION:   op = SRT
ff90: 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b  _Union;    break
ffa0: 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  ;.         case 
ffb0: 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d  TK_ALL:     op =
ffc0: 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 62   SRT_Table;    b
ffd0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
ffe0: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
fff0: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  0;.      p->pOrd
10000 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
10010 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72  p->disallowOrder
10020 42 79 20 3d 20 70 4f 72 64 65 72 42 79 21 3d 30  By = pOrderBy!=0
10030 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
10040 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
10050 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
10060 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
10070 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
10080 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
10090 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65  0;.      unionde
100a0 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20  st.eDest = op;. 
100b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
100c0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
100d0 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 2c 20 30  p, &uniondest, 0
100e0 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
100f0 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61      /* Query fla
10100 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74  ttening in sqlit
10110 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74  e3Select() might
10120 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65   refill p->pOrde
10130 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65  rBy..      ** Be
10140 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20   sure to delete 
10150 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65  p->pOrderBy, the
10160 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64  refore, to avoid
10170 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20   a memory leak. 
10180 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
10190 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
101a0 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
101b0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
101c0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
101d0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
101e0 72 42 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rBy;.      sqlit
101f0 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
10200 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
10210 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
10220 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
10230 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
10240 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
10250 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f   -1;.      p->iO
10260 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20 20 20  ffset = -1;.    
10270 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
10280 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
10290 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
102a0 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   }...      /* Co
102b0 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69  nvert the data i
102c0 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
102d0 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65  table into whate
102e0 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a  ver form.      *
102f0 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20  * it is that we 
10300 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a  currently need..
10310 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20        */      . 
10320 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
10330 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20  est!=priorOp || 
10340 75 6e 69 6f 6e 54 61 62 21 3d 64 65 73 74 2e 69  unionTab!=dest.i
10350 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Parm ){.        
10360 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
10370 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
10380 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
10390 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
103a0 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
103b0 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
103c0 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
103d0 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20   *pFirst = p;.  
103e0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
103f0 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
10400 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
10410 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
10420 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
10430 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
10440 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
10450 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
10460 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
10470 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
10480 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
10490 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
104a0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
104b0 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c          computeL
104c0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
104d0 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
104e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
104f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10500 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54  P_Rewind, unionT
10510 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  ab, iBreak);.   
10520 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
10530 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
10540 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
10550 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65   rc = selectInne
10560 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
10570 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f   p->pEList, unio
10580 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  nTab, p->pEList-
10590 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105b0 20 20 20 20 20 70 4f 72 64 65 72 42 79 2c 20 2d       pOrderBy, -
105c0 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  1, &dest, iCont,
105d0 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20   iBreak, 0);.   
105e0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
105f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
10600 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
10610 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
10620 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10630 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
10640 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
10650 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Cont);.        s
10660 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10670 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
10680 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a  onTab, iStart);.
10690 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
106a0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
106b0 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
106c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
106d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
106e0 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
106f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
10700 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
10710 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
10720 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  T: {.      int t
10730 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20  ab1, tab2;.     
10740 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
10750 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
10760 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
10770 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  *pOffset;.      
10780 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
10790 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72  SelectDest inter
107a0 73 65 63 74 64 65 73 74 3b 0a 0a 20 20 20 20 20  sectdest;..     
107b0 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73   /* INTERSECT is
107c0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
107d0 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65  the others since
107e0 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20   it requires.   
107f0 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72     ** two tempor
10800 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e  ary tables.  Hen
10810 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77  ce it has its ow
10820 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20  n case.  Begin. 
10830 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63       ** by alloc
10840 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73  ating the tables
10850 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20   we will need.. 
10860 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61       */.      ta
10870 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b1 = pParse->nTa
10880 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20  b++;.      tab2 
10890 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
108a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f 63  ;.      if( proc
108b0 65 73 73 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72  essCompoundOrder
108c0 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 74 61  By(pParse, p, ta
108d0 62 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  b1) ){.        r
108e0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
108f0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
10900 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
10910 20 20 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e      createSortin
10920 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  gIndex(pParse, p
10930 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20  , pOrderBy);..  
10940 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
10950 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10960 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
10970 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
10980 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
10990 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
109a0 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
109b0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
109c0 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
109d0 70 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73  pRightmost->uses
109e0 45 70 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Ephm = 1;.      
109f0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
10a00 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
10a10 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
10a20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
10a30 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
10a40 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
10a50 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  /.      sqlite3S
10a60 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69  electDestInit(&i
10a70 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52  ntersectdest, SR
10a80 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a  T_Union, tab1);.
10a90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10aa0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
10ab0 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73   pPrior, &inters
10ac0 65 63 74 64 65 73 74 2c 20 30 2c 20 30 2c 20 30  ectdest, 0, 0, 0
10ad0 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66  , aff);.      if
10ae0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
10af0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
10b00 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
10b10 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
10b20 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
10b30 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
10b40 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
10b50 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
10b60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
10b70 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
10b80 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20  phemeral, tab2, 
10b90 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
10ba0 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
10bb0 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[1] == -1 );.  
10bc0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
10bd0 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[1] = addr;. 
10be0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
10bf0 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
10c00 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
10c10 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
10c20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
10c30 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
10c40 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
10c50 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72  = 0;.      inter
10c60 73 65 63 74 64 65 73 74 2e 69 50 61 72 6d 20 3d  sectdest.iParm =
10c70 20 74 61 62 32 3b 0a 20 20 20 20 20 20 72 63 20   tab2;.      rc 
10c80 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
10c90 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65  pParse, p, &inte
10ca0 72 73 65 63 74 64 65 73 74 2c 20 30 2c 20 30 2c  rsectdest, 0, 0,
10cb0 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
10cc0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
10cd0 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  or;.      sqlite
10ce0 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
10cf0 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
10d00 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
10d10 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
10d20 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
10d30 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
10d40 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
10d50 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
10d60 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
10d70 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
10d80 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65  take the interse
10d90 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f  ction of the two
10da0 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
10db0 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20   ** tables..    
10dc0 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
10dd0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
10de0 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
10df0 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
10e00 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65  ck ){.        Se
10e10 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
10e20 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
10e30 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
10e40 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
10e50 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  t->pPrior;.     
10e60 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
10e70 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
10e80 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
10e90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10ea0 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
10eb0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
10ec0 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  );.      iCont =
10ed0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
10ee0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
10ef0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
10f00 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
10f10 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
10f20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10f30 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
10f40 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20  tab1, iBreak);. 
10f50 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
10f60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
10f70 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61  v, OP_RowKey, ta
10f80 62 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b1);.      sqlit
10f90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10fa0 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62  OP_NotFound, tab
10fb0 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  2, iCont);.     
10fc0 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65   rc = selectInne
10fd0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
10fe0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31   p->pEList, tab1
10ff0 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
11000 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
11010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11020 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 26   pOrderBy, -1, &
11030 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
11040 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  eak, 0);.      i
11050 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
11060 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
11070 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
11080 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
11090 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
110a0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
110b0 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73   iCont);.      s
110c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
110d0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62  (v, OP_Next, tab
110e0 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20  1, iStart);.    
110f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
11100 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
11110 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
11120 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11130 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c   OP_Close, tab2,
11140 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
11150 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11160 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20  OP_Close, tab1, 
11170 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
11180 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11190 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53   Make sure all S
111a0 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74  ELECTs in the st
111b0 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65  atement have the
111c0 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
111d0 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e  elements.  ** in
111e0 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65   their result se
111f0 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ts..  */.  asser
11200 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  t( p->pEList && 
11210 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29  pPrior->pEList )
11220 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  ;.  if( p->pELis
11230 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72  t->nExpr!=pPrior
11240 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
11250 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
11260 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11270 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c  SELECTs to the l
11280 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66  eft and right of
11290 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20   %s".      " do 
112a0 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  not have the sam
112b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
112c0 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c  lt columns", sel
112d0 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
112e0 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
112f0 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
11300 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
11310 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62   /* Set the numb
11320 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
11330 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
11340 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20  s.  */.  nCol = 
11350 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
11360 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 65 74 50  ;.  while( nSetP
11370 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  2 ){.    sqlite3
11380 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
11390 61 53 65 74 50 32 5b 2d 2d 6e 53 65 74 50 32 5d  aSetP2[--nSetP2]
113a0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20  , nCol);.  }..  
113b0 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
113c0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
113d0 73 65 64 20 62 79 20 65 69 74 68 65 72 20 74 68  sed by either th
113e0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
113f0 65 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e 79  e or.  ** by any
11400 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
11410 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c  s needed to impl
11420 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75  ement the compou
11430 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20  nd select..  ** 
11440 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e  Attach the KeyIn
11450 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
11460 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61  all temporary ta
11470 62 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74 68  bles.  Invoke th
11480 65 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20  e.  ** ORDER BY 
11490 70 72 6f 63 65 73 73 69 6e 67 20 69 66 20 74 68  processing if th
114a0 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
114b0 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  BY clause..  **.
114c0 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f    ** This sectio
114d0 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20  n is run by the 
114e0 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43  right-most SELEC
114f0 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79  T statement only
11500 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74  ..  ** SELECT st
11510 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  atements to the 
11520 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70  left always skip
11530 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65   this part.  The
11540 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
11550 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c   SELECT might al
11560 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  so skip this par
11570 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f  t if it has no O
11580 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
11590 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20  nd.  ** no temp 
115a0 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69  tables are requi
115b0 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  red..  */.  if( 
115c0 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e 75  pOrderBy || p->u
115d0 73 65 73 45 70 68 6d 20 29 7b 0a 20 20 20 20 69  sesEphm ){.    i
115e0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
115f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11600 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
11610 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
11620 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
11630 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
11640 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
11650 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
11660 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
11670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11680 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
11690 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74  hrough SELECT st
116a0 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
116b0 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  int nKeyCol;    
116c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
116d0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
116e0 65 73 20 69 6e 20 70 4b 65 79 49 6e 66 6f 2d 3e  es in pKeyInfo->
116f0 61 43 6f 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f  aCol[] */.    Co
11700 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
11710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
11720 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
11730 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
11740 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  ll[] */.    Coll
11750 53 65 71 20 2a 2a 61 43 6f 70 79 3b 20 20 20 20  Seq **aCopy;    
11760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
11770 6f 70 79 20 6f 66 20 70 4b 65 79 49 6e 66 6f 2d  opy of pKeyInfo-
11780 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 0a 20 20 20  >aColl[] */..   
11790 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
117a0 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20  htmost==p );.   
117b0 20 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20   nKeyCol = nCol 
117c0 2b 20 28 70 4f 72 64 65 72 42 79 20 3f 20 70 4f  + (pOrderBy ? pO
117d0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20  rderBy->nExpr : 
117e0 30 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  0);.    pKeyInfo
117f0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
11800 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
11810 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
11820 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
11830 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 4b 65 79  (*pKeyInfo)+nKey
11840 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  Col*(sizeof(Coll
11850 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20 20  Seq*) + 1));.   
11860 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29   if( !pKeyInfo )
11870 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
11880 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
11890 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
118a0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20  ct_end;.    }.. 
118b0 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63     pKeyInfo->enc
118c0 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
118d0 62 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  b);.    pKeyInfo
118e0 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b  ->nField = nCol;
118f0 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61  ..    for(i=0, a
11900 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  pColl=pKeyInfo->
11910 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69  aColl; i<nCol; i
11920 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20  ++, apColl++){. 
11930 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d       *apColl = m
11940 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
11950 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
11960 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61  .      if( 0==*a
11970 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
11980 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73   *apColl = pPars
11990 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
119a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
119b0 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
119c0 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
119d0 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
119e0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
119f0 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
11a00 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
11a10 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
11a20 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
11a30 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
11a40 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
11a50 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
11a60 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
11a70 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
11a80 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
11a90 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
11aa0 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
11ab0 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
11ac0 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
11ad0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
11ae0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
11af0 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
11b00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
11b10 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
11b20 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
11b30 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
11b40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11b50 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
11b60 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49  dr, (char*)pKeyI
11b70 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
11b80 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ;.        pLoop-
11b90 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
11ba0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
11bb0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f     }..    if( pO
11bc0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
11bd0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
11be0 69 74 65 6d 20 2a 70 4f 54 65 72 6d 20 3d 20 70  item *pOTerm = p
11bf0 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 20 20  OrderBy->a;.    
11c00 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 45 78    int nOrderByEx
11c10 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  pr = pOrderBy->n
11c20 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Expr;.      int 
11c30 61 64 64 72 3b 0a 20 20 20 20 20 20 75 38 20 2a  addr;.      u8 *
11c40 70 53 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 20  pSortOrder;..   
11c50 20 20 20 2f 2a 20 52 65 75 73 65 20 74 68 65 20     /* Reuse the 
11c60 73 61 6d 65 20 70 4b 65 79 49 6e 66 6f 20 66 6f  same pKeyInfo fo
11c70 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61  r the ORDER BY a
11c80 73 20 77 61 73 20 75 73 65 64 20 61 62 6f 76 65  s was used above
11c90 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68   for.      ** th
11ca0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
11cb0 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 45  t statements.  E
11cc0 78 63 65 70 74 20 77 65 20 68 61 76 65 20 74 6f  xcept we have to
11cd0 20 63 68 61 6e 67 65 20 6f 75 74 20 74 68 65 0a   change out the.
11ce0 20 20 20 20 20 20 2a 2a 20 70 4b 65 79 49 6e 66        ** pKeyInf
11cf0 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65  o->aColl[] value
11d00 73 2e 20 20 53 6f 6d 65 20 6f 66 20 74 68 65 20  s.  Some of the 
11d10 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65 73 20 77  aColl[] values w
11d20 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ill be.      ** 
11d30 72 65 75 73 65 64 20 77 68 65 6e 20 63 6f 6e 73  reused when cons
11d40 74 72 75 63 74 69 6e 67 20 74 68 65 20 70 4b 65  tructing the pKe
11d50 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 4f 52  yInfo for the OR
11d60 44 45 52 20 42 59 2c 20 73 6f 20 6d 61 6b 65 0a  DER BY, so make.
11d70 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79 2e        ** a copy.
11d80 20 20 53 75 66 66 69 63 69 65 6e 74 20 73 70 61    Sufficient spa
11d90 63 65 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20  ce to hold both 
11da0 74 68 65 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73  the nCol entries
11db0 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68   for.      ** th
11dc0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
11dd0 74 20 61 6e 64 20 74 68 65 20 6e 4f 72 64 65 72  t and the nOrder
11de0 62 79 45 78 70 72 20 65 6e 74 72 69 65 73 20 66  byExpr entries f
11df0 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  or the ORDER BY.
11e00 20 20 20 20 20 20 2a 2a 20 77 61 73 20 61 6c 6c        ** was all
11e10 6f 63 61 74 65 64 20 61 62 6f 76 65 2e 20 20 42  ocated above.  B
11e20 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 6f  ut we need to mo
11e30 76 65 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ve the compound 
11e40 73 65 6c 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  select.      ** 
11e50 65 6e 74 72 69 65 73 20 6f 75 74 20 6f 66 20 74  entries out of t
11e60 68 65 20 77 61 79 20 62 65 66 6f 72 65 20 63 6f  he way before co
11e70 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 4f  nstructing the O
11e80 52 44 45 52 20 42 59 20 65 6e 74 72 69 65 73 2e  RDER BY entries.
11e90 0a 20 20 20 20 20 20 2a 2a 20 4d 6f 76 65 20 74  .      ** Move t
11ea0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
11eb0 63 74 20 65 6e 74 72 69 65 73 20 69 6e 74 6f 20  ct entries into 
11ec0 61 43 6f 70 79 5b 5d 20 77 68 65 72 65 20 74 68  aCopy[] where th
11ed0 65 79 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20  ey can be.      
11ee0 2a 2a 20 61 63 63 65 73 73 65 64 20 61 6e 64 20  ** accessed and 
11ef0 72 65 75 73 65 64 20 77 68 65 6e 20 63 6f 6e 73  reused when cons
11f00 74 72 75 63 74 69 6e 67 20 74 68 65 20 4f 52 44  tructing the ORD
11f10 45 52 20 42 59 20 65 6e 74 72 69 65 73 2e 0a 20  ER BY entries.. 
11f20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
11f30 6e 43 6f 6c 20 6d 69 67 68 74 20 62 65 20 67 72  nCol might be gr
11f40 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 6c 65  eater than or le
11f50 73 73 20 74 68 61 6e 20 6e 4f 72 64 65 72 42 79  ss than nOrderBy
11f60 45 78 70 72 0a 20 20 20 20 20 20 2a 2a 20 77 65  Expr.      ** we
11f70 20 68 61 76 65 20 74 6f 20 75 73 65 20 6d 65 6d   have to use mem
11f80 6d 6f 76 65 28 29 20 77 68 65 6e 20 64 6f 69 6e  move() when doin
11f90 67 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20 20  g the copy..    
11fa0 20 20 2a 2f 0a 20 20 20 20 20 20 61 43 6f 70 79    */.      aCopy
11fb0 20 3d 20 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43   = &pKeyInfo->aC
11fc0 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 45 78 70 72  oll[nOrderByExpr
11fd0 5d 3b 0a 20 20 20 20 20 20 70 53 6f 72 74 4f 72  ];.      pSortOr
11fe0 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  der = pKeyInfo->
11ff0 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
12000 2a 29 26 61 43 6f 70 79 5b 6e 43 6f 6c 5d 3b 0a  *)&aCopy[nCol];.
12010 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 61 43        memmove(aC
12020 6f 70 79 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  opy, pKeyInfo->a
12030 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a 73 69 7a 65 6f  Coll, nCol*sizeo
12040 66 28 43 6f 6c 6c 53 65 71 2a 29 29 3b 0a 0a 20  f(CollSeq*));.. 
12050 20 20 20 20 20 61 70 43 6f 6c 6c 20 3d 20 70 4b       apColl = pK
12060 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a 20  eyInfo->aColl;. 
12070 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
12080 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 20 69 2b  nOrderByExpr; i+
12090 2b 2c 20 70 4f 54 65 72 6d 2b 2b 2c 20 61 70 43  +, pOTerm++, apC
120a0 6f 6c 6c 2b 2b 2c 20 70 53 6f 72 74 4f 72 64 65  oll++, pSortOrde
120b0 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  r++){.        Ex
120c0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 54 65  pr *pExpr = pOTe
120d0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
120e0 20 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e 66     if( (pExpr->f
120f0 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
12100 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  late) ){.       
12110 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
12120 2d 3e 70 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20  ->pColl!=0 );.  
12130 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20          *apColl 
12140 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a  = pExpr->pColl;.
12150 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
12160 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c           *apColl
12170 20 3d 20 61 43 6f 70 79 5b 70 45 78 70 72 2d 3e   = aCopy[pExpr->
12180 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20 20  iColumn];.      
12190 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 53 6f    }.        *pSo
121a0 72 74 4f 72 64 65 72 20 3d 20 70 4f 54 65 72 6d  rtOrder = pOTerm
121b0 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
121c0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
121d0 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t( p->pRightmost
121e0 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==p );.      ass
121f0 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
12200 45 70 68 6d 5b 32 5d 3e 3d 30 20 29 3b 0a 20 20  Ephm[2]>=0 );.  
12210 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 61 64      addr = p->ad
12220 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 3b 0a 20  drOpenEphm[2];. 
12230 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12240 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
12250 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  , p->pOrderBy->n
12260 45 78 70 72 2b 32 29 3b 0a 20 20 20 20 20 20 70  Expr+2);.      p
12270 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
12280 3d 20 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 0a  = nOrderByExpr;.
12290 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
122a0 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
122b0 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  r, (char*)pKeyIn
122c0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
122d0 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 70  ANDOFF);.      p
122e0 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20  KeyInfo = 0;.   
122f0 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
12300 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76  ail(pParse, p, v
12310 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
12320 70 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  pr, &dest);.    
12330 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  }..    sqlite3_f
12340 72 65 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ree(pKeyInfo);. 
12350 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74   }..multi_select
12360 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69  _end:.  pDest->i
12370 4d 65 6d 20 3d 20 64 65 73 74 2e 69 4d 65 6d 3b  Mem = dest.iMem;
12380 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12390 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
123a0 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
123b0 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65  ELECT */..#ifnde
123c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
123d0 45 57 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  EW./* Forward De
123e0 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74  clarations */.st
123f0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
12400 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a  xprList(sqlite3*
12410 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74  , ExprList*, int
12420 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
12430 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
12440 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20  elect(sqlite3*, 
12450 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45  Select *, int, E
12460 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a  xprList *);../*.
12470 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
12480 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
12490 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
124a0 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
124b0 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
124c0 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
124d0 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
124e0 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d   of the iColumn-
124f0 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  th.** entry in p
12500 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
12510 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
12520 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
12530 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
12540 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ).**.** This rou
12550 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20  tine is part of 
12560 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70  the flattening p
12570 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62  rocedure.  A sub
12580 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72  query.** whose r
12590 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66  esult set is def
125a0 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61  ined by pEList a
125b0 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20  ppears as entry 
125c0 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  in the.** FROM c
125d0 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
125e0 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  T such that the 
125f0 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69  VDBE cursor assi
12600 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20  gned to that.** 
12610 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FORM clause entr
12620 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68  y is iTable.  Th
12630 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20  is routine make 
12640 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a  the necessary .*
12650 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78  * changes to pEx
12660 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65  pr so that it re
12670 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
12680 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
12690 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71  e.** of the subq
126a0 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20  uery rather the 
126b0 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
126c0 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
126d0 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
126e0 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20  Expr(.  sqlite3 
126f0 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52  *db,        /* R
12700 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
12710 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e  ors to this conn
12720 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
12730 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
12740 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68  /* Expr in which
12750 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63   substitution oc
12760 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  curs */.  int iT
12770 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  able,         /*
12780 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62   Table to be sub
12790 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78  stituted */.  Ex
127a0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
127b0 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
127c0 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29  expressions */.)
127d0 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  {.  if( pExpr==0
127e0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
127f0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
12800 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
12810 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29  iTable==iTable )
12820 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
12830 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
12840 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
12850 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TK_NULL;.    }el
12860 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
12870 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65  pNew;.      asse
12880 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26  rt( pEList!=0 &&
12890 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
128a0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
128b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
128c0 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26  Expr->pLeft==0 &
128d0 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  & pExpr->pRight=
128e0 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69  =0 && pExpr->pLi
128f0 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  st==0 );.      p
12900 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  New = pEList->a[
12910 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
12920 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
12930 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a  ert( pNew!=0 );.
12940 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
12950 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20  = pNew->op;.    
12960 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
12970 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20  >pLeft==0 );.   
12980 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
12990 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
129a0 28 64 62 2c 20 70 4e 65 77 2d 3e 70 4c 65 66 74  (db, pNew->pLeft
129b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
129c0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
129d0 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
129e0 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74  ->pRight = sqlit
129f0 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e  e3ExprDup(db, pN
12a00 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  ew->pRight);.   
12a10 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
12a20 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  ->pList==0 );.  
12a30 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74      pExpr->pList
12a40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
12a50 73 74 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e  stDup(db, pNew->
12a60 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 45  pList);.      pE
12a70 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e  xpr->iTable = pN
12a80 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ew->iTable;.    
12a90 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20    pExpr->pTab = 
12aa0 70 4e 65 77 2d 3e 70 54 61 62 3b 0a 20 20 20 20  pNew->pTab;.    
12ab0 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
12ac0 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e   = pNew->iColumn
12ad0 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
12ae0 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67  Agg = pNew->iAgg
12af0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
12b00 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 45  okenCopy(db, &pE
12b10 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65  xpr->token, &pNe
12b20 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  w->token);.     
12b30 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
12b40 79 28 64 62 2c 20 26 70 45 78 70 72 2d 3e 73 70  y(db, &pExpr->sp
12b50 61 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29  an, &pNew->span)
12b60 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
12b70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
12b80 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4e  SelectDup(db, pN
12b90 65 77 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ew->pSelect);.  
12ba0 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73      pExpr->flags
12bb0 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73 3b 0a   = pNew->flags;.
12bc0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
12bd0 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c     substExpr(db,
12be0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69   pExpr->pLeft, i
12bf0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
12c00 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62      substExpr(db
12c10 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
12c20 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
12c30 3b 0a 20 20 20 20 73 75 62 73 74 53 65 6c 65 63  ;.    substSelec
12c40 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 53 65  t(db, pExpr->pSe
12c50 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  lect, iTable, pE
12c60 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
12c70 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78  ExprList(db, pEx
12c80 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62 6c  pr->pList, iTabl
12c90 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
12ca0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
12cb0 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73  bstExprList(.  s
12cc0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
12cd0 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
12ce0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65  lloc errors here
12cf0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
12d00 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69  pList,     /* Li
12d10 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69  st to scan and i
12d20 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
12d30 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20  substitutes */. 
12d40 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
12d50 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
12d60 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
12d70 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
12d80 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75  pEList     /* Su
12d90 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20  bstitute values 
12da0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
12db0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
12dc0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
12dd0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
12de0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62  r; i++){.    sub
12df0 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74  stExpr(db, pList
12e00 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54  ->a[i].pExpr, iT
12e10 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
12e20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
12e30 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20   substSelect(.  
12e40 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
12e50 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
12e60 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
12e70 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
12e80 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
12e90 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
12ea0 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
12eb0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a   substitutions *
12ec0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
12ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
12ee0 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64  e to be replaced
12ef0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
12f00 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75  pEList     /* Su
12f10 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20  bstitute values 
12f20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 21 70 20 29  */.){.  if( !p )
12f30 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74   return;.  subst
12f40 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e  ExprList(db, p->
12f50 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20  pEList, iTable, 
12f60 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
12f70 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e  ExprList(db, p->
12f80 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65  pGroupBy, iTable
12f90 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
12fa0 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
12fb0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62  ->pOrderBy, iTab
12fc0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
12fd0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
12fe0 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c  pHaving, iTable,
12ff0 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
13000 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68  tExpr(db, p->pWh
13010 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ere, iTable, pEL
13020 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c  ist);.  substSel
13030 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  ect(db, p->pPrio
13040 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
13050 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  t);.}.#endif /* 
13060 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13070 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23  OMIT_VIEW) */..#
13080 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13090 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68  IT_VIEW./*.** Th
130a0 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
130b0 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73  pts to flatten s
130c0 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64  ubqueries in ord
130d0 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65  er to speed.** e
130e0 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65  xecution.  It re
130f0 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61  turns 1 if it ma
13100 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20  kes changes and 
13110 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69  0 if no flatteni
13120 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a  ng.** occurs..**
13130 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e  .** To understan
13140 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66  d the concept of
13150 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e   flattening, con
13160 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
13170 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a  ing.** query:.**
13180 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
13190 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b   FROM (SELECT x+
131a0 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
131b0 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52  HERE z<100) WHER
131c0 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E a>5.**.** The 
131d0 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69  default way of i
131e0 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73  mplementing this
131f0 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65   query is to exe
13200 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71  cute the.** subq
13210 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73  uery first and s
13220 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
13230 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
13240 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72  table, then.** r
13250 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  un the outer que
13260 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  ry on that tempo
13270 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69  rary table.  Thi
13280 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a  s requires two.*
13290 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68  * passes over th
132a0 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72  e data.  Further
132b0 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68  more, because th
132c0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
132d0 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69  e.** has no indi
132e0 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63  ces, the WHERE c
132f0 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74  lause on the out
13300 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  er query cannot 
13310 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e  be.** optimized.
13320 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
13330 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
13340 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20  rewrite queries 
13350 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76  such as the abov
13360 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  e into.** a sing
13370 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20  le flat select, 
13380 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
13390 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20       SELECT x+y 
133a0 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
133b0 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35  RE z<100 AND a>5
133c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
133d0 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
133e0 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e  is simpification
133f0 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20   gives the same 
13400 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e  result.** but on
13410 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74  ly has to scan t
13420 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41  he data once.  A
13430 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63  nd because indic
13440 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69  es might .** exi
13450 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  st on the table 
13460 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73  t1, a complete s
13470 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20  can of the data 
13480 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69  might be.** avoi
13490 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74  ded..**.** Flatt
134a0 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74  ening is only at
134b0 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f  tempted if all o
134c0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
134d0 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
134e0 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75    (1)  The subqu
134f0 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
13500 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
13510 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74  oth use aggregat
13520 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  es..**.**   (2) 
13530 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
13540 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
13550 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  e or the outer q
13560 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
13570 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20  in..**.**   (3) 
13580 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
13590 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f   not the right o
135a0 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
135b0 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a   outer join, or.
135c0 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 73 75  **        the su
135d0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 69 74  bquery is not it
135e0 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20 28 54  self a join.  (T
135f0 69 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a 0a 2a  icket #306).**.*
13600 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62  *   (4)  The sub
13610 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53  query is not DIS
13620 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74  TINCT or the out
13630 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
13640 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
13650 28 35 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (5)  The subquer
13660 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
13670 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
13680 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
13690 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72  e.**        aggr
136a0 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  egates..**.**   
136b0 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (6)  The subquer
136c0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
136d0 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
136e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
136f0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
13700 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
13710 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
13720 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61  y has a FROM cla
13730 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29  use..**.**   (8)
13740 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
13750 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
13760 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
13770 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
13780 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20  in..**.**   (9) 
13790 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
137a0 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
137b0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
137c0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
137d0 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
137e0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  gates..**.**  (1
137f0 30 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  0)  The subquery
13800 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
13810 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
13820 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
13830 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75   not.**        u
13840 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
13850 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75   (11)  The subqu
13860 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
13870 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
13880 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42  oth have ORDER B
13890 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  Y clauses..**.**
138a0 20 20 28 31 32 29 20 20 54 68 65 20 73 75 62 71    (12)  The subq
138b0 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
138c0 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20  right term of a 
138d0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
138e0 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  or the.**       
138f0 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
13900 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
13910 28 61 64 64 65 64 20 62 79 20 74 69 63 6b 65 74  (added by ticket
13920 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 20 28 31   #350).**.**  (1
13930 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
13940 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79   and outer query
13950 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
13960 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20 28 31   LIMIT.**.**  (1
13970 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
13980 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46   does not use OF
13990 46 53 45 54 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29  FSET.**.**  (15)
139a0 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
139b0 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  y is not part of
139c0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
139d0 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20  ct or the.**    
139e0 20 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65      subquery doe
139f0 73 20 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20  s not have both 
13a00 61 6e 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20  an ORDER BY and 
13a10 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a  a LIMIT clause..
13a20 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74  **        (See t
13a30 69 63 6b 65 74 20 23 32 33 33 39 29 0a 2a 2a 0a  icket #2339).**.
13a40 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
13a50 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
13a60 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
13a70 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
13a80 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
13a90 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
13aa0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
13ab0 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
13ac0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
13ad0 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
13ae0 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
13af0 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
13b00 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
13b10 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
13b20 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
13b30 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
13b40 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
13b50 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
13b60 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
13b70 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
13b80 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
13b90 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
13ba0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
13bb0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
13bc0 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
13bd0 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
13be0 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
13bf0 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
13c00 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
13c10 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
13c20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
13c30 65 72 79 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ery(.  sqlite3 *
13c40 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44  db,         /* D
13c50 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
13c60 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
13c70 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
13c80 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75  The parent or ou
13c90 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  ter SELECT state
13ca0 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  ment */.  int iF
13cb0 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rom,           /
13cc0 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53  * Index in p->pS
13cd0 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69  rc->a[] of the i
13ce0 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f  nner subquery */
13cf0 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20  .  int isAgg,   
13d00 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
13d10 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  if outer SELECT 
13d20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
13d30 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
13d40 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  t subqueryIsAgg 
13d50 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
13d60 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
13d70 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
13d80 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  ons */.){.  Sele
13d90 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20  ct *pSub;       
13da0 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  /* The inner que
13db0 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22  ry or "subquery"
13dc0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
13dd0 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
13de0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
13df0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
13e00 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
13e10 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  ubSrc;   /* The 
13e20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
13e30 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
13e40 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
13e50 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  ;    /* The resu
13e60 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
13e70 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
13e80 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
13e90 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
13ea0 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
13eb0 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
13ec0 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
13ed0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
13ee0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
13ef0 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
13f00 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
13f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13f20 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
13f30 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
13f40 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d  t_item *pSubitem
13f50 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75  ;   /* The subqu
13f60 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  ery */..  /* Che
13f70 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61  ck to see if fla
13f80 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
13f90 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20  tted.  Return 0 
13fa0 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69  if not..  */.  i
13fb0 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
13fc0 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
13fd0 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
13fe0 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
13ff0 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
14000 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74  nSrc );.  pSubit
14010 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46  em = &pSrc->a[iF
14020 72 6f 6d 5d 3b 0a 20 20 70 53 75 62 20 3d 20 70  rom];.  pSub = p
14030 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
14040 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
14050 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41  !=0 );.  if( isA
14060 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49 73  gg && subqueryIs
14070 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20  Agg ) return 0; 
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14090 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
140a0 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75 62  1)  */.  if( sub
140b0 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53  queryIsAgg && pS
140c0 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74  rc->nSrc>1 ) ret
140d0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
140e0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
140f0 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72 63  2)  */.  pSubSrc
14100 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20   = pSub->pSrc;. 
14110 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63   assert( pSubSrc
14120 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74   );.  /* Prior t
14130 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c  o version 3.1.2,
14140 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
14150 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65  OFFSET had to be
14160 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74   simple constant
14170 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69  s,.  ** not arbi
14180 74 72 61 72 79 20 65 78 70 72 65 73 73 73 69 6f  trary expresssio
14190 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73  ns, we allowed s
141a0 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66  ome combining of
141b0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
141c0 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74  T.  ** because t
141d0 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d  hey could be com
141e0 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  puted at compile
141f0 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e  -time.  But when
14200 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
14210 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72  T.  ** became ar
14220 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69  bitrary expressi
14230 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72  ons, we were for
14240 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72  ced to add restr
14250 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a  ictions (13).  *
14260 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20  * and (14). */. 
14270 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
14280 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29  t && p->pLimit )
14290 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
142a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
142b0 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20  iction (13) */. 
142c0 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73   if( pSub->pOffs
142d0 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  et ) return 0;  
142e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
14300 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20  iction (14) */. 
14310 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f   if( p->pRightmo
14320 73 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d  st && pSub->pLim
14330 69 74 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  it && pSub->pOrd
14340 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75  erBy ){.    retu
14350 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
14360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14380 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
14390 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (15) */.  }.  if
143a0 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d  ( pSubSrc->nSrc=
143b0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
143c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143d0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
143e0 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66  ion (7)  */.  if
143f0 28 20 28 70 53 75 62 2d 3e 69 73 44 69 73 74 69  ( (pSub->isDisti
14400 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 70 4c 69  nct || pSub->pLi
14410 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20 20 26  mit) .         &
14420 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  & (pSrc->nSrc>1 
14430 7c 7c 20 69 73 41 67 67 29 20 29 7b 20 20 20 20  || isAgg) ){    
14440 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
14450 74 69 6f 6e 73 20 28 34 29 28 35 29 28 38 29 28  tions (4)(5)(8)(
14460 39 29 20 2a 2f 0a 20 20 20 20 20 72 65 74 75 72  9) */.     retur
14470 6e 20 30 3b 20 20 20 20 20 20 20 0a 20 20 7d 0a  n 0;       .  }.
14480 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73 74 69    if( p->isDisti
14490 6e 63 74 20 26 26 20 73 75 62 71 75 65 72 79 49  nct && subqueryI
144a0 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
144b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
144c0 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a  riction (6)  */.
144d0 20 20 69 66 28 20 28 70 2d 3e 64 69 73 61 6c 6c    if( (p->disall
144e0 6f 77 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e  owOrderBy || p->
144f0 70 4f 72 64 65 72 42 79 29 20 26 26 20 70 53 75  pOrderBy) && pSu
14500 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
14510 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
14520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14540 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
14550 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20  iction (11) */. 
14560 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63   }..  /* Restric
14570 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20  tion 3:  If the 
14580 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f  subquery is a jo
14590 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
145a0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20  e subquery is . 
145b0 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20   ** not used as 
145c0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
145d0 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f  d of an outer jo
145e0 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66  in.  Examples of
145f0 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69   why this.  ** i
14600 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
14610 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
14620 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
14630 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29  OIN (t2 JOIN t3)
14640 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
14650 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
14660 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
14670 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
14680 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
14690 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20  R JOIN t2) JOIN 
146a0 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69  t3.  **.  ** whi
146b0 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  ch is not at all
146c0 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e   the same thing.
146d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
146e0 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20 28  Src->nSrc>1 && (
146f0 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
14700 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
14710 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
14720 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  0;.  }..  /* Res
14730 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66  triction 12:  If
14740 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
14750 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
14760 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
14770 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61  er.  ** join, ma
14780 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
14790 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
147a0 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41  E clause..  ** A
147b0 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68  n examples of wh
147c0 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c  y this is not al
147d0 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
147e0 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
147f0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c   OUTER JOIN (SEL
14800 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48  ECT * FROM t2 WH
14810 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a  ERE t2.x>0).  **
14820 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
14830 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
14840 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
14850 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
14860 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
14870 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e 78  N t2) WHERE t2.x
14880 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74  >0.  **.  ** But
14890 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74   the t2.x>0 test
148a0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69   will always fai
148b0 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20  l on a NULL row 
148c0 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a  of t2, which.  *
148d0 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f  * effectively co
148e0 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45 52  nverts the OUTER
148f0 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e   JOIN into an IN
14900 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20  NER JOIN..  */. 
14910 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e   if( (pSubitem->
14920 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
14930 54 45 52 29 21 3d 30 20 26 26 20 70 53 75 62 2d  TER)!=0 && pSub-
14940 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a 20 20  >pWhere!=0 ){.  
14950 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
14960 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
14970 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
14980 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e   means flattenin
14990 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 66  g is permitted f
149a0 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f  or the.  ** iFro
149b0 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68  m-th entry of th
149c0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  e FROM clause in
149d0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
149e0 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76  ..  */..  /* Mov
149f0 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  e all of the FRO
14a00 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
14a10 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
14a20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
14a30 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
14a40 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
14a50 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
14a60 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
14a70 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
14a80 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
14a90 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
14aa0 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
14ab0 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
14ac0 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
14ad0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
14ae0 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
14af0 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
14b00 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
14b10 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
14b20 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
14b30 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
14b40 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
14b50 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
14b60 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
14b70 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
14b80 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
14b90 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
14ba0 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
14bb0 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74  iParent = pSubit
14bc0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 7b  em->iCursor;.  {
14bd0 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63  .    int nSubSrc
14be0 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
14bf0 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79  ;.    int jointy
14c00 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a  pe = pSubitem->j
14c10 6f 69 6e 74 79 70 65 3b 0a 0a 20 20 20 20 73 71  ointype;..    sq
14c20 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
14c30 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 29  (pSubitem->pTab)
14c40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
14c50 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  ee(pSubitem->zDa
14c60 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
14c70 69 74 65 33 5f 66 72 65 65 28 70 53 75 62 69 74  ite3_free(pSubit
14c80 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
14c90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 75  sqlite3_free(pSu
14ca0 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  bitem->zAlias);.
14cb0 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54      pSubitem->pT
14cc0 61 62 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  ab = 0;.    pSub
14cd0 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  item->zDatabase 
14ce0 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 69 74 65  = 0;.    pSubite
14cf0 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  m->zName = 0;.  
14d00 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69    pSubitem->zAli
14d10 61 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  as = 0;.    if( 
14d20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20  nSubSrc>1 ){.   
14d30 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d 20 6e     int extra = n
14d40 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20 20 20  SubSrc - 1;.    
14d50 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53 75    for(i=1; i<nSu
14d60 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
14d70 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74      pSrc = sqlit
14d80 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
14d90 64 62 2c 20 70 53 72 63 2c 20 30 2c 20 30 29 3b  db, pSrc, 0, 0);
14da0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 72  .        if( pSr
14db0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
14dc0 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20    p->pSrc = 0;. 
14dd0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
14de0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
14df0 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 53     }.      p->pS
14e00 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 20  rc = pSrc;.     
14e10 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
14e20 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46  c-1; i-extra>=iF
14e30 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  rom; i--){.     
14e40 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20     pSrc->a[i] = 
14e50 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d  pSrc->a[i-extra]
14e60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14e70 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
14e80 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
14e90 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46      pSrc->a[i+iF
14ea0 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e  rom] = pSubSrc->
14eb0 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73  a[i];.      mems
14ec0 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69  et(&pSubSrc->a[i
14ed0 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75  ], 0, sizeof(pSu
14ee0 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20  bSrc->a[i]));.  
14ef0 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b    }.    pSrc->a[
14f00 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20  iFrom].jointype 
14f10 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 7d 0a  = jointype;.  }.
14f20 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20  .  /* Now begin 
14f30 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62  substituting sub
14f40 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74  query result set
14f50 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72   expressions for
14f60 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65   .  ** reference
14f70 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74  s to the iParent
14f80 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
14f90 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ery..  ** .  ** 
14fa0 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  Example:.  **.  
14fb0 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c  **   SELECT a+5,
14fc0 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45   b*10 FROM (SELE
14fd0 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31  CT x*3 AS a, y+1
14fe0 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20  0 AS b FROM t1) 
14ff0 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a 2a 20  WHERE a>b;.  ** 
15000 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
15010 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
15020 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
15030 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
15040 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20 20 5c       /.  **    \
15050 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
15060 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72  _____ outer quer
15070 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  y ______________
15080 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
15090 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c  /.  **.  ** We l
150a0 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70  ook at every exp
150b0 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f  ression in the o
150c0 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65  uter query and e
150d0 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
150e0 65 0a 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75  e.  ** "a" we su
150f0 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61  bstitute "x*3" a
15100 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
15110 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62  e see "b" we sub
15120 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a  stitute "y+10"..
15130 20 20 2a 2f 0a 20 20 70 4c 69 73 74 20 3d 20 70    */.  pList = p
15140 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28  ->pEList;.  for(
15150 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
15160 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
15170 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20  xpr *pExpr;.    
15180 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
15190 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78  zName==0 && (pEx
151a0 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
151b0 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21  .pExpr)->span.z!
151c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73  =0 ){.      pLis
151d0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
151e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
151f0 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
15200 62 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d  b, (char*)pExpr-
15210 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  >span.z, pExpr->
15220 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20  span.n);.    }. 
15230 20 7d 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69   }.  substExprLi
15240 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  st(db, p->pEList
15250 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
15260 3e 70 45 4c 69 73 74 29 3b 0a 20 20 69 66 28 20  >pEList);.  if( 
15270 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73 75 62  isAgg ){.    sub
15280 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
15290 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72  ->pGroupBy, iPar
152a0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
152b0 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
152c0 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  r(db, p->pHaving
152d0 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
152e0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  >pEList);.  }.  
152f0 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
15300 42 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  By ){.    assert
15310 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
15320 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65   );.    p->pOrde
15330 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64  rBy = pSub->pOrd
15340 65 72 42 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e  erBy;.    pSub->
15350 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
15360 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f 72  }else if( p->pOr
15370 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 75 62  derBy ){.    sub
15380 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
15390 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72  ->pOrderBy, iPar
153a0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
153b0 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  t);.  }.  if( pS
153c0 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20  ub->pWhere ){.  
153d0 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74    pWhere = sqlit
153e0 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
153f0 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 7d  ub->pWhere);.  }
15400 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65 72 65  else{.    pWhere
15410 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
15420 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
15430 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
15440 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20  pHaving==0 );.  
15450 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70    p->pHaving = p
15460 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 70 2d  ->pWhere;.    p-
15470 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
15480 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
15490 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  db, p->pHaving, 
154a0 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
154b0 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
154c0 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
154d0 45 78 70 72 41 6e 64 28 64 62 2c 20 70 2d 3e 70  ExprAnd(db, p->p
154e0 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20 20  Having, .       
154f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15500 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15510 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
15520 2d 3e 70 48 61 76 69 6e 67 29 29 3b 0a 20 20 20  ->pHaving));.   
15530 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
15540 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70  upBy==0 );.    p
15550 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
15560 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
15570 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70  db, pSub->pGroup
15580 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  By);.  }else{.  
15590 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20    substExpr(db, 
155a0 70 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65  p->pWhere, iPare
155b0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
155c0 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65  );.    p->pWhere
155d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
155e0 64 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  d(db, p->pWhere,
155f0 20 70 57 68 65 72 65 29 3b 0a 20 20 7d 0a 0a 20   pWhere);.  }.. 
15600 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65   /* The flattene
15610 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  d query is disti
15620 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68  nct if either th
15630 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20  e inner or the. 
15640 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
15650 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20  is distinct. .  
15660 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73 74 69 6e  */.  p->isDistin
15670 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e  ct = p->isDistin
15680 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69  ct || pSub->isDi
15690 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 0a 20 20  stinct;..  /*.  
156a0 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  ** SELECT ... FR
156b0 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c  OM (SELECT ... L
156c0 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29  IMIT a OFFSET b)
156d0 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20   LIMIT x OFFSET 
156e0 79 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 65  y;.  **.  ** One
156f0 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74   is tempted to t
15700 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20  ry to add a and 
15710 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65  b to combine the
15720 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68   limits.  But th
15730 69 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  is.  ** does not
15740 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20   work if either 
15750 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
15760 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  e..  */.  if( pS
15770 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ub->pLimit ){.  
15780 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53    p->pLimit = pS
15790 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20  ub->pLimit;.    
157a0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pSub->pLimit = 0
157b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69  ;.  }..  /* Fini
157c0 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61  ally, delete wha
157d0 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65  t is left of the
157e0 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65   subquery and re
157f0 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  turn.  ** succes
15800 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
15810 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
15820 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  ub);.  return 1;
15830 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
15840 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
15850 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
15860 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
15870 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61  ment passed as a
15880 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65  n argument to se
15890 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20  e if it.** is a 
158a0 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
158b0 75 65 72 79 2e 20 52 65 74 75 72 6e 20 4f 52 44  uery. Return ORD
158c0 45 52 42 59 5f 4d 49 4e 20 6f 72 20 4f 52 44 45  ERBY_MIN or ORDE
158d0 52 42 59 5f 4d 41 58 20 69 66 20 0a 2a 2a 20 69  RBY_MAX if .** i
158e0 74 20 69 73 2c 20 6f 72 20 30 20 6f 74 68 65 72  t is, or 0 other
158f0 77 69 73 65 2e 20 41 74 20 70 72 65 73 65 6e 74  wise. At present
15900 2c 20 61 20 71 75 65 72 79 20 69 73 20 63 6f 6e  , a query is con
15910 73 69 64 65 72 65 64 20 74 6f 20 62 65 0a 2a 2a  sidered to be.**
15920 20 61 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20 71   a min()/max() q
15930 75 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  uery if:.**.**  
15940 20 31 2e 20 54 68 65 72 65 20 69 73 20 61 20 73   1. There is a s
15950 69 6e 67 6c 65 20 6f 62 6a 65 63 74 20 69 6e 20  ingle object in 
15960 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
15970 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65 72  .**.**   2. Ther
15980 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20 65 78  e is a single ex
15990 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
159a0 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20  result set, and 
159b0 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 65 69  it is.**      ei
159c0 74 68 65 72 20 6d 69 6e 28 78 29 20 6f 72 20 6d  ther min(x) or m
159d0 61 78 28 78 29 2c 20 77 68 65 72 65 20 78 20 69  ax(x), where x i
159e0 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  s a column refer
159f0 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
15a00 69 6e 74 20 6d 69 6e 4d 61 78 51 75 65 72 79 28  int minMaxQuery(
15a10 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
15a20 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 45 78 70  elect *p){.  Exp
15a30 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72  r *pExpr;.  Expr
15a40 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
15a50 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28  ->pEList;..  if(
15a60 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
15a70 31 20 29 20 72 65 74 75 72 6e 20 4f 52 44 45 52  1 ) return ORDER
15a80 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45 78  BY_NORMAL;.  pEx
15a90 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30  pr = pEList->a[0
15aa0 5d 2e 70 45 78 70 72 3b 0a 20 20 70 45 4c 69 73  ].pExpr;.  pELis
15ab0 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
15ac0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
15ad0 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
15ae0 4f 4e 20 7c 7c 20 70 45 4c 69 73 74 3d 3d 30 20  ON || pEList==0 
15af0 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  || pEList->nExpr
15b00 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
15b10 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
15b20 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  0].pExpr->op!=TK
15b30 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  _AGG_COLUMN ) re
15b40 74 75 72 6e 20 4f 52 44 45 52 42 59 5f 4e 4f 52  turn ORDERBY_NOR
15b50 4d 41 4c 3b 0a 20 20 69 66 28 20 70 45 78 70 72  MAL;.  if( pExpr
15b60 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72  ->token.n!=3 ) r
15b70 65 74 75 72 6e 20 4f 52 44 45 52 42 59 5f 4e 4f  eturn ORDERBY_NO
15b80 52 4d 41 4c 3b 0a 20 20 69 66 28 20 73 71 6c 69  RMAL;.  if( sqli
15b90 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61  te3StrNICmp((cha
15ba0 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
15bb0 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b  z,"min",3)==0 ){
15bc0 0a 20 20 20 20 72 65 74 75 72 6e 20 4f 52 44 45  .    return ORDE
15bd0 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73 65  RBY_MIN;.  }else
15be0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
15bf0 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78 70  ICmp((char*)pExp
15c00 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22  r->token.z,"max"
15c10 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ,3)==0 ){.    re
15c20 74 75 72 6e 20 4f 52 44 45 52 42 59 5f 4d 41 58  turn ORDERBY_MAX
15c30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 4f  ;.  }.  return O
15c40 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d  RDERBY_NORMAL;.}
15c50 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15c60 74 69 6e 65 20 72 65 73 6f 6c 76 65 73 20 61 6e  tine resolves an
15c70 79 20 6e 61 6d 65 73 20 75 73 65 64 20 69 6e 20  y names used in 
15c80 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
15c90 66 20 74 68 65 0a 2a 2a 20 73 75 70 70 6c 69 65  f the.** supplie
15ca0 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
15cb0 6e 74 2e 20 49 66 20 74 68 65 20 53 45 4c 45 43  nt. If the SELEC
15cc0 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
15cd0 67 20 72 65 73 6f 6c 76 65 64 0a 2a 2a 20 69 73  g resolved.** is
15ce0 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2c 20 74   a sub-select, t
15cf0 68 65 6e 20 70 4f 75 74 65 72 4e 43 20 69 73 20  hen pOuterNC is 
15d00 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
15d10 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 0a 2a 2a   NameContext .**
15d20 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 53   of the parent S
15d30 45 4c 45 43 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ELECT..*/.int sq
15d40 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c  lite3SelectResol
15d50 76 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ve(.  Parse *pPa
15d60 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
15d70 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
15d80 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
15d90 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
15da0 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
15db0 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
15dc0 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ed. */.  NameCon
15dd0 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20  text *pOuterNC  
15de0 2f 2a 20 54 68 65 20 6f 75 74 65 72 20 6e 61 6d  /* The outer nam
15df0 65 20 63 6f 6e 74 65 78 74 2e 20 4d 61 79 20 62  e context. May b
15e00 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20  e NULL. */.){.  
15e10 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
15e20 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
15e30 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 69  sult set. */.  i
15e40 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
15e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
15e60 2d 6c 6f 6f 70 20 76 61 72 69 61 62 6c 65 20 75  -loop variable u
15e70 73 65 64 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20  sed in multiple 
15e80 70 6c 61 63 65 73 20 2a 2f 0a 20 20 4e 61 6d 65  places */.  Name
15e90 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
15ea0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20         /* Local 
15eb0 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 2a 2f 0a  name-context */.
15ec0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
15ed0 75 70 42 79 3b 20 20 20 20 20 20 20 20 2f 2a 20  upBy;        /* 
15ee0 54 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61  The group by cla
15ef0 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  use */..  /* If 
15f00 74 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  this routine has
15f10 20 72 75 6e 20 62 65 66 6f 72 65 2c 20 72 65 74   run before, ret
15f20 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  urn immediately.
15f30 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73 52   */.  if( p->isR
15f40 65 73 6f 6c 76 65 64 20 29 7b 0a 20 20 20 20 61  esolved ){.    a
15f50 73 73 65 72 74 28 20 21 70 4f 75 74 65 72 4e 43  ssert( !pOuterNC
15f60 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
15f70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
15f80 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 3d 20  p->isResolved = 
15f90 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  1;..  /* If ther
15fa0 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  e have already b
15fb0 65 65 6e 20 65 72 72 6f 72 73 2c 20 64 6f 20 6e  een errors, do n
15fc0 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28  othing. */.  if(
15fd0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
15fe0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
15ff0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
16000 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68  .  /* Prepare th
16010 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
16020 6e 74 2e 20 54 68 69 73 20 63 61 6c 6c 20 77 69  nt. This call wi
16030 6c 6c 20 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20  ll allocate all 
16040 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 72 65 71  cursors.  ** req
16050 75 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65 20  uired to handle 
16060 74 68 65 20 74 61 62 6c 65 73 20 61 6e 64 20 73  the tables and s
16070 75 62 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  ubqueries in the
16080 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20   FROM clause..  
16090 2a 2f 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c  */.  if( prepSel
160a0 65 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20  ectStmt(pParse, 
160b0 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
160c0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
160d0 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65   }..  /* Resolve
160e0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
160f0 20 69 6e 20 74 68 65 20 4c 49 4d 49 54 20 61 6e   in the LIMIT an
16100 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
16110 2e 20 54 68 65 73 65 0a 20 20 2a 2a 20 61 72 65  . These.  ** are
16120 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20   not allowed to 
16130 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 61 6d  refer to any nam
16140 65 73 2c 20 73 6f 20 70 61 73 73 20 61 6e 20 65  es, so pass an e
16150 6d 70 74 79 20 4e 61 6d 65 43 6f 6e 74 65 78 74  mpty NameContext
16160 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
16170 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
16180 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 50 61  sNC));.  sNC.pPa
16190 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
161a0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
161b0 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43  esolveNames(&sNC
161c0 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a  , p->pLimit) ||.
161d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
161e0 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
161f0 4e 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 20  NC, p->pOffset) 
16200 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
16210 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
16220 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65  .  /* Set up the
16230 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74   local name-cont
16240 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20 45  ext to pass to E
16250 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
16260 29 20 74 6f 0a 20 20 2a 2a 20 72 65 73 6f 6c 76  ) to.  ** resolv
16270 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
16280 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e  -list..  */.  sN
16290 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a  C.allowAgg = 1;.
162a0 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
162b0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 73 4e 43 2e   p->pSrc;.  sNC.
162c0 70 4e 65 78 74 20 3d 20 70 4f 75 74 65 72 4e 43  pNext = pOuterNC
162d0 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  ;..  /* Resolve 
162e0 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65 73  names in the res
162f0 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 70 45  ult set. */.  pE
16300 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
16310 3b 0a 20 20 69 66 28 20 21 70 45 4c 69 73 74 20  ;.  if( !pEList 
16320 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
16330 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 69 3d 30  ERROR;.  for(i=0
16340 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
16350 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
16360 72 20 2a 70 58 20 3d 20 70 45 4c 69 73 74 2d 3e  r *pX = pEList->
16370 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
16380 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
16390 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43  esolveNames(&sNC
163a0 2c 20 70 58 29 20 29 7b 0a 20 20 20 20 20 20 72  , pX) ){.      r
163b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
163c0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OR;.    }.  }.. 
163d0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
163e0 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   no aggregate fu
163f0 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 72  nctions in the r
16400 65 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e  esult-set, and n
16410 6f 20 47 52 4f 55 50 20 42 59 20 0a 20 20 2a 2a  o GROUP BY .  **
16420 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20   expression, do 
16430 6e 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72 65 67  not allow aggreg
16440 61 74 65 73 20 69 6e 20 61 6e 79 20 6f 66 20 74  ates in any of t
16450 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  he other express
16460 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ions..  */.  ass
16470 65 72 74 28 20 21 70 2d 3e 69 73 41 67 67 20 29  ert( !p->isAgg )
16480 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70  ;.  pGroupBy = p
16490 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 69 66  ->pGroupBy;.  if
164a0 28 20 70 47 72 6f 75 70 42 79 20 7c 7c 20 73 4e  ( pGroupBy || sN
164b0 43 2e 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20  C.hasAgg ){.    
164c0 70 2d 3e 69 73 41 67 67 20 3d 20 31 3b 0a 20 20  p->isAgg = 1;.  
164d0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 4e 43 2e 61  }else{.    sNC.a
164e0 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 7d  llowAgg = 0;.  }
164f0 0a 0a 20 20 2f 2a 20 49 66 20 61 20 48 41 56 49  ..  /* If a HAVI
16500 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70 72 65  NG clause is pre
16510 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 72 65  sent, then there
16520 20 6d 75 73 74 20 62 65 20 61 20 47 52 4f 55 50   must be a GROUP
16530 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f   BY clause..  */
16540 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e  .  if( p->pHavin
16550 67 20 26 26 20 21 70 47 72 6f 75 70 42 79 20 29  g && !pGroupBy )
16560 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
16570 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
16580 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
16590 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
165a0 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20  ore HAVING");.  
165b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
165c0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
165d0 20 41 64 64 20 74 68 65 20 65 78 70 72 65 73 73   Add the express
165e0 69 6f 6e 20 6c 69 73 74 20 74 6f 20 74 68 65 20  ion list to the 
165f0 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 62 65 66  name-context bef
16600 6f 72 65 20 70 61 72 73 69 6e 67 20 74 68 65 0a  ore parsing the.
16610 20 20 2a 2a 20 6f 74 68 65 72 20 65 78 70 72 65    ** other expre
16620 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 53 45  ssions in the SE
16630 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
16640 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a  This is so that.
16650 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73    ** expressions
16660 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
16670 61 75 73 65 20 28 65 74 63 2e 29 20 63 61 6e 20  ause (etc.) can 
16680 72 65 66 65 72 20 74 6f 20 65 78 70 72 65 73 73  refer to express
16690 69 6f 6e 73 20 62 79 0a 20 20 2a 2a 20 61 6c 69  ions by.  ** ali
166a0 61 73 65 73 20 69 6e 20 74 68 65 20 72 65 73 75  ases in the resu
166b0 6c 74 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a  lt set..  **.  *
166c0 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49  * Minor point: I
166d0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
166e0 73 65 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  se, then the exp
166f0 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  ression will be.
16700 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61 74 65    ** re-evaluate
16710 64 20 66 6f 72 20 65 61 63 68 20 72 65 66 65 72  d for each refer
16720 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f  ence to it..  */
16730 0a 20 20 73 4e 43 2e 70 45 4c 69 73 74 20 3d 20  .  sNC.pEList = 
16740 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
16750 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
16760 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
16770 2d 3e 70 57 68 65 72 65 29 20 7c 7c 0a 20 20 20  ->pWhere) ||.   
16780 20 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73    sqlite3ExprRes
16790 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20  olveNames(&sNC, 
167a0 70 2d 3e 70 48 61 76 69 6e 67 29 20 29 7b 0a 20  p->pHaving) ){. 
167b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
167c0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
167d0 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
167e0 7b 0a 20 20 20 20 69 66 28 20 70 72 6f 63 65 73  {.    if( proces
167f0 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  sOrderGroupBy(pP
16800 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  arse, p, p->pOrd
16810 65 72 42 79 2c 20 31 2c 20 26 73 4e 43 2e 68 61  erBy, 1, &sNC.ha
16820 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 72  sAgg) ){.      r
16830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
16840 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
16850 69 66 28 20 70 72 6f 63 65 73 73 4f 72 64 65 72  if( processOrder
16860 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
16870 70 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20  p, pGroupBy, 0, 
16880 26 73 4e 43 2e 68 61 73 41 67 67 29 20 29 7b 0a  &sNC.hasAgg) ){.
16890 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
168a0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
168b0 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
168c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
168d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
168e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
168f0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
16900 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
16910 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
16920 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
16930 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
16940 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
16950 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
16960 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
16970 20 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70   .    for(i=0, p
16980 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61  Item=pGroupBy->a
16990 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
169a0 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
169b0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 45 78  +){.      if( Ex
169c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 49  prHasProperty(pI
169d0 74 65 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 41  tem->pExpr, EP_A
169e0 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  gg) ){.        s
169f0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16a00 50 61 72 73 65 2c 20 22 61 67 67 72 65 67 61 74  Parse, "aggregat
16a10 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  e functions are 
16a20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 22  not allowed in "
16a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 74 68  .            "th
16a40 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
16a50 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  e");.        ret
16a60 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
16a70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16a80 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
16a90 73 20 69 73 20 6f 6e 65 20 53 45 4c 45 43 54 20  s is one SELECT 
16aa0 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2c 20 62  of a compound, b
16ab0 65 20 73 75 72 65 20 74 6f 20 72 65 73 6f 6c 76  e sure to resolv
16ac0 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 69 6e 20  e names.  ** in 
16ad0 74 68 65 20 6f 74 68 65 72 20 53 45 4c 45 43 54  the other SELECT
16ae0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
16af0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72  >pPrior ){.    r
16b00 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 65 6c  eturn sqlite3Sel
16b10 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
16b20 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 70 4f  e, p->pPrior, pO
16b30 75 74 65 72 4e 43 29 3b 0a 20 20 7d 65 6c 73 65  uterNC);.  }else
16b40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
16b50 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
16b60 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61  *.** Reset the a
16b70 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
16b80 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
16b90 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
16ba0 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f  lator is a set o
16bb0 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
16bc0 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65  hat hold.** inte
16bd0 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
16be0 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69   while calculati
16bf0 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  ng an aggregate.
16c00 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
16c10 65 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73 20  e simply stores 
16c20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20  NULLs in all of 
16c30 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c  those memory cel
16c40 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
16c50 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61  id resetAccumula
16c60 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
16c70 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
16c80 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
16c90 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
16ca0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
16cb0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
16cc0 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28 20 70   *pFunc;.  if( p
16cd0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70  AggInfo->nFunc+p
16ce0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
16cf0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
16d00 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  n;.  }.  for(i=0
16d10 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; i<pAggInfo->nC
16d20 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
16d30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16d40 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
16d50 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  , pAggInfo->aCol
16d60 5b 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20  [i].iMem);.  }. 
16d70 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49   for(pFunc=pAggI
16d80 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b  nfo->aFunc, i=0;
16d90 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
16da0 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b  nc; i++, pFunc++
16db0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
16dc0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
16dd0 75 6c 6c 2c 20 30 2c 20 70 46 75 6e 63 2d 3e 69  ull, 0, pFunc->i
16de0 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 46  Mem);.    if( pF
16df0 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d  unc->iDistinct>=
16e00 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
16e10 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78  *pE = pFunc->pEx
16e20 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
16e30 2d 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45  ->pList==0 || pE
16e40 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  ->pList->nExpr!=
16e50 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
16e60 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
16e70 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 69  rse, "DISTINCT i
16e80 6e 20 61 67 67 72 65 67 61 74 65 20 6d 75 73 74  n aggregate must
16e90 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20   be followed ". 
16ea0 20 20 20 20 20 20 20 20 20 20 22 62 79 20 61 6e            "by an
16eb0 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20   expression");. 
16ec0 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44         pFunc->iD
16ed0 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
16ee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16ef0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
16f00 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
16f10 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
16f20 65 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20  e, pE->pList);. 
16f30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16f40 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
16f50 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46  penEphemeral, pF
16f60 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20  unc->iDistinct, 
16f70 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
16f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f90 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
16fa0 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
16fb0 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OFF);.      }.  
16fc0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
16fd0 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
16fe0 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
16ff0 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
17000 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
17010 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
17020 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
17030 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
17040 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
17050 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
17060 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
17070 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
17080 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
17090 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
170a0 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
170b0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
170c0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
170d0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
170e0 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
170f0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
17100 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
17110 3e 70 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69  >pList;.    sqli
17120 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
17130 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46   OP_AggFinal, pF
17140 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20  ->iMem, pList ? 
17150 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
17160 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
17170 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
17180 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  *)pF->pFunc, P4_
17190 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a  FUNCDEF);.  }.}.
171a0 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
171b0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65  e accumulator me
171c0 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  mory cells for a
171d0 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65  n aggregate base
171e0 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72  d on.** the curr
171f0 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
17200 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
17210 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75  oid updateAccumu
17220 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
17230 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
17240 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
17250 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
17260 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
17270 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
17280 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74  nc *pF;.  struct
17290 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
172a0 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64  ;..  pAggInfo->d
172b0 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
172c0 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
172d0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
172e0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
172f0 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
17300 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
17310 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
17320 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
17330 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
17340 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
17350 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69 66 28  ->pList;.    if(
17360 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
17370 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nArg = pList->nE
17380 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67  xpr;.      regAg
17390 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
173a0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
173b0 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  nArg);.      sql
173c0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
173d0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69  List(pParse, pLi
173e0 73 74 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20  st, regAgg);.   
173f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41   }else{.      nA
17400 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  rg = 0;.      re
17410 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  gAgg = 0;.    }.
17420 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73      if( pF->iDis
17430 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
17440 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
17450 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
17460 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  l(v);.      asse
17470 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
17480 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63       codeDistinc
17490 74 28 76 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  t(v, pF->iDistin
174a0 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c  ct, addrNext, 1,
174b0 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a   regAgg);.    }.
174c0 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
174d0 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29  c->needCollSeq )
174e0 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
174f0 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
17500 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
17510 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
17520 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
17530 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
17540 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21  =0 );  /* pList!
17550 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 2d  =0 if pF->pFunc-
17560 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 69 73 20  >needCollSeq is 
17570 74 72 75 65 20 2a 2f 0a 20 20 20 20 20 20 66 6f  true */.      fo
17580 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(j=0, pItem=pLi
17590 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26  st->a; !pColl &&
175a0 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49   j<nArg; j++, pI
175b0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
175c0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
175d0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
175e0 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
175f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17600 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
17610 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50        pColl = pP
17620 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
17630 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
17640 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17650 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
17660 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  eq, 0, 0, 0, (ch
17670 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
17680 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20  OLLSEQ);.    }. 
17690 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
176a0 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74  dOp4(v, OP_AggSt
176b0 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70  ep, 0, regAgg, p
176c0 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20  F->iMem,.       
176d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
176e0 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c  void*)pF->pFunc,
176f0 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
17700 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
17710 6e 67 65 50 35 28 76 2c 20 6e 41 72 67 29 3b 0a  ngeP5(v, nArg);.
17720 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
17730 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
17740 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
17750 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e  );.    if( addrN
17760 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ext ){.      sql
17770 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
17780 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74  abel(v, addrNext
17790 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
177a0 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49  or(i=0, pC=pAggI
177b0 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67  nfo->aCol; i<pAg
177c0 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
177d0 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b  tor; i++, pC++){
177e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
177f0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d  Code(pParse, pC-
17800 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d  >pExpr, pC->iMem
17810 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66  );.  }.  pAggInf
17820 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
17830 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  0;.}..#ifndef SQ
17840 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
17850 52 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  R./*.** This fun
17860 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 77 68  ction is used wh
17870 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
17880 65 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f  ement is used to
17890 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 74 65 6d   create a.** tem
178a0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 66 6f 72  porary table for
178b0 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
178c0 67 68 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  gh when running 
178d0 61 6e 20 49 4e 53 54 45 41 44 20 4f 46 0a 2a 2a  an INSTEAD OF.**
178e0 20 55 50 44 41 54 45 20 6f 72 20 49 4e 53 54 45   UPDATE or INSTE
178f0 41 44 20 4f 46 20 44 45 4c 45 54 45 20 74 72 69  AD OF DELETE tri
17900 67 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  gger. .**.** If 
17910 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 53 45  possible, the SE
17920 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
17930 73 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68  s modified so th
17940 61 74 20 4e 55 4c 4c 20 76 61 6c 75 65 73 0a 2a  at NULL values.*
17950 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  * are stored in 
17960 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
17970 62 6c 65 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75  ble for all colu
17980 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  mns for which th
17990 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  e .** correspond
179a0 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d  ing bit in argum
179b0 65 6e 74 20 6d 61 73 6b 20 69 73 20 6e 6f 74 20  ent mask is not 
179c0 73 65 74 2e 20 49 66 20 6d 61 73 6b 20 74 61 6b  set. If mask tak
179d0 65 73 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 61  es the.** specia
179e0 6c 20 76 61 6c 75 65 20 30 78 66 66 66 66 66 66  l value 0xffffff
179f0 66 66 2c 20 74 68 65 6e 20 61 6c 6c 20 63 6f 6c  ff, then all col
17a00 75 6d 6e 73 20 61 72 65 20 70 6f 70 75 6c 61 74  umns are populat
17a10 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
17a20 65 33 53 65 6c 65 63 74 4d 61 73 6b 28 50 61 72  e3SelectMask(Par
17a30 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
17a40 63 74 20 2a 70 2c 20 75 33 32 20 6d 61 73 6b 29  ct *p, u32 mask)
17a50 7b 0a 20 20 69 66 28 20 21 70 2d 3e 70 50 72 69  {.  if( !p->pPri
17a60 6f 72 20 26 26 20 21 70 2d 3e 69 73 44 69 73 74  or && !p->isDist
17a70 69 6e 63 74 20 26 26 20 6d 61 73 6b 21 3d 30 78  inct && mask!=0x
17a80 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
17a90 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
17aa0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
17ab0 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
17ac0 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
17ad0 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  , p, 0) ){.     
17ae0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
17af0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
17b00 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
17b10 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  st;.    for(i=0;
17b20 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
17b30 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a   && i<32; i++){.
17b40 20 20 20 20 20 20 69 66 28 20 21 28 6d 61 73 6b        if( !(mask
17b50 26 28 28 75 33 32 29 31 3c 3c 69 29 29 20 29 7b  &((u32)1<<i)) ){
17b60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17b70 45 78 70 72 44 65 6c 65 74 65 28 70 45 4c 69 73  ExprDelete(pELis
17b80 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
17b90 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e          pEList->
17ba0 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c  a[i].pExpr = sql
17bb0 69 74 65 33 45 78 70 72 28 70 50 61 72 73 65 2d  ite3Expr(pParse-
17bc0 3e 64 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c  >db, TK_NULL, 0,
17bd0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
17be0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
17bf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
17c00 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
17c10 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
17c20 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54  the given SELECT
17c30 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
17c40 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
17c50 65 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e  e distributed in
17c60 20 76 61 72 69 6f 75 73 20 77 61 79 73 20 64 65   various ways de
17c70 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a  pending on the.*
17c80 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
17c90 65 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72  e SelectDest str
17ca0 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
17cb0 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20 70 44  o by argument pD
17cc0 65 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77  est.** as follow
17cd0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65  s:.**.**     pDe
17ce0 73 74 2d 3e 65 44 65 73 74 20 20 20 20 52 65 73  st->eDest    Res
17cf0 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d  ult.**     -----
17d00 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
17d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17d30 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52  ------.**     SR
17d40 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e  T_Callback    In
17d50 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63  voke the callbac
17d60 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  k for each row o
17d70 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  f the result..**
17d80 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20  .**     SRT_Mem 
17d90 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69          Store fi
17da0 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65  rst result in me
17db0 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d  mory cell pDest-
17dc0 3e 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  >iParm.**.**    
17dd0 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20   SRT_Set        
17de0 20 53 74 6f 72 65 20 6e 6f 6e 2d 6e 75 6c 6c 20   Store non-null 
17df0 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20  results as keys 
17e00 6f 66 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  of table pDest->
17e10 69 50 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20 20  iParm. .**      
17e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
17e30 70 70 6c 79 20 74 68 65 20 61 66 66 69 6e 69 74  pply the affinit
17e40 79 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74  y pDest->affinit
17e50 79 20 62 65 66 6f 72 65 20 73 74 6f 72 69 6e 67  y before storing
17e60 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   them..**.**    
17e70 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20   SRT_Union      
17e80 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61   Store results a
17e90 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d  s a key in a tem
17ea0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65  porary table pDe
17eb0 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  st->iParm..**.**
17ec0 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20       SRT_Except 
17ed0 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75       Remove resu
17ee0 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d  lts from the tem
17ef0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65  porary table pDe
17f00 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  st->iParm..**.**
17f10 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20       SRT_Table  
17f20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
17f30 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  ts in temporary 
17f40 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61  table pDest->iPa
17f50 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  rm.**.**     SRT
17f60 5f 45 70 68 65 6d 54 61 62 20 20 20 20 43 72 65  _EphemTab    Cre
17f70 61 74 65 20 61 6e 20 74 65 6d 70 6f 72 61 72 79  ate an temporary
17f80 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50   table pDest->iP
17f90 61 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a  arm and store.**
17fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fb0 20 20 20 20 20 74 68 65 20 72 65 73 75 6c 74 20       the result 
17fc0 74 68 65 72 65 2e 20 54 68 65 20 63 75 72 73 6f  there. The curso
17fd0 72 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20 61  r is left open a
17fe0 66 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  fter.**         
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
18000 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  rning..**.**    
18010 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20   SRT_Subroutine 
18020 20 46 6f 72 20 65 61 63 68 20 72 6f 77 20 72 65   For each row re
18030 74 75 72 6e 65 64 2c 20 70 75 73 68 20 74 68 65  turned, push the
18040 20 72 65 73 75 6c 74 73 20 6f 6e 74 6f 20 74 68   results onto th
18050 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
18060 20 20 20 20 20 20 20 20 20 76 64 62 65 20 73 74           vdbe st
18070 61 63 6b 20 61 6e 64 20 63 61 6c 6c 20 74 68 65  ack and call the
18080 20 73 75 62 72 6f 75 74 69 6e 65 20 28 76 69 61   subroutine (via
18090 20 4f 50 5f 47 6f 73 75 62 29 0a 2a 2a 20 20 20   OP_Gosub).**   
180a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180b0 20 20 61 74 20 61 64 64 72 65 73 73 20 70 44 65    at address pDe
180c0 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  st->iParm..**.**
180d0 20 20 20 20 20 53 52 54 5f 45 78 69 73 74 73 20       SRT_Exists 
180e0 20 20 20 20 20 53 74 6f 72 65 20 61 20 31 20 69       Store a 1 i
180f0 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70 44  n memory cell pD
18100 65 73 74 2d 3e 69 50 61 72 6d 20 69 66 20 74 68  est->iParm if th
18110 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20  e result.**     
18120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18130 73 65 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  set is not empty
18140 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
18150 44 69 73 63 61 72 64 20 20 20 20 20 54 68 72 6f  Discard     Thro
18160 77 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 77  w the results aw
18170 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68  ay..**.** See th
18180 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  e selectInnerLoo
18190 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  p() function for
181a0 20 61 20 63 61 6e 6f 6e 69 63 61 6c 20 6c 69 73   a canonical lis
181b0 74 69 6e 67 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ting of the .** 
181c0 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f  allowed values o
181d0 66 20 65 44 65 73 74 20 61 6e 64 20 74 68 65 69  f eDest and thei
181e0 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a  r meanings..**.*
181f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
18200 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
18210 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
18220 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a   any errors are.
18230 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
18240 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  then an appropri
18250 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
18260 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20  e is left in.** 
18270 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
18280 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18290 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65  ine does NOT fre
182a0 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  e the Select str
182b0 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e  ucture passed in
182c0 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
182d0 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  g function needs
182e0 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a   to do that..**.
182f0 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20  ** The pParent, 
18300 70 61 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a  parentTab, and *
18310 70 50 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64  pParentAgg field
18320 73 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20  s are filled in 
18330 69 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43  if this.** SELEC
18340 54 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2e  T is a subquery.
18350 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
18360 61 79 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e  ay try to combin
18370 65 20 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a  e this SELECT.**
18380 20 77 69 74 68 20 69 74 73 20 70 61 72 65 6e 74   with its parent
18390 20 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c   to form a singl
183a0 65 20 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49  e flat query.  I
183b0 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d  n so doing, it m
183c0 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74  ight.** change t
183d0 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
183e0 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65  from a non-aggre
183f0 67 61 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65  gate to an aggre
18400 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46  gate query..** F
18410 6f 72 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20  or that reason, 
18420 74 68 65 20 70 50 61 72 65 6e 74 41 67 67 20 66  the pParentAgg f
18430 6c 61 67 20 69 73 20 70 61 73 73 65 64 20 61 73  lag is passed as
18440 20 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69   a pointer, so i
18450 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e  t.** can be chan
18460 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  ged..**.** Examp
18470 6c 65 20 31 3a 20 20 20 54 68 65 20 6d 65 61 6e  le 1:   The mean
18480 69 6e 67 20 6f 66 20 74 68 65 20 70 50 61 72 65  ing of the pPare
18490 6e 74 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  nt parameter..**
184a0 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
184b0 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45  FROM t1 JOIN (SE
184c0 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29  LECT x, count(*)
184d0 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74   FROM t2) JOIN t
184e0 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20 20  3;.**    \      
184f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18500 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  \_______ subquer
18510 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  y _______/      
18520 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20 20 20    /.**     \    
18530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18560 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f    /.**      \___
18570 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18580 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f  _ outer query __
18590 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
185a0 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  _/.**.** This ro
185b0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
185c0 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75  for the outer qu
185d0 65 72 79 20 66 69 72 73 74 2e 20 20 20 46 6f 72  ery first.   For
185e0 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70   that call,.** p
185f0 50 61 72 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e  Parent will be N
18600 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74 68 65  ULL.  During the
18610 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74   processing of t
18620 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2c 20  he outer query, 
18630 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65  this .** routine
18640 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72   is called recur
18650 73 69 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65  sively to handle
18660 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
18670 46 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76  For the recursiv
18680 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65  e.** call, pPare
18690 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f  nt will point to
186a0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
186b0 2e 20 20 42 65 63 61 75 73 65 20 74 68 65 20 73  .  Because the s
186c0 75 62 71 75 65 72 79 20 69 73 0a 2a 2a 20 74 68  ubquery is.** th
186d0 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74  e second element
186e0 20 69 6e 20 61 20 74 68 72 65 65 2d 77 61 79 20   in a three-way 
186f0 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72 65 6e 74  join, the parent
18700 54 61 62 20 70 61 72 61 6d 65 74 65 72 20 77 69  Tab parameter wi
18710 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68 65 20  ll.** be 1 (the 
18720 32 6e 64 20 76 61 6c 75 65 20 6f 66 20 61 20 30  2nd value of a 0
18730 2d 69 6e 64 65 78 65 64 20 61 72 72 61 79 2e 29  -indexed array.)
18740 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
18750 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
18760 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
18770 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
18780 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
18790 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
187a0 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
187b0 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
187c0 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65  coded. */.  Sele
187d0 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
187e0 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
187f0 20 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20   with the query 
18800 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 53 65 6c  results */.  Sel
18810 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  ect *pParent,   
18820 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
18830 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68 20  ELECT for which 
18840 74 68 69 73 20 69 73 20 61 20 73 75 62 2d 71 75  this is a sub-qu
18850 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72  ery */.  int par
18860 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20 20  entTab,         
18870 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61 72  /* Index in pPar
18880 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68 69  ent->pSrc of thi
18890 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  s query */.  int
188a0 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 20 20   *pParentAgg,   
188b0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
188c0 50 61 72 65 6e 74 20 75 73 65 73 20 61 67 67 72  Parent uses aggr
188d0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
188e0 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20  */.  char *aff  
188f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
18900 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55  f eDest is SRT_U
18910 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69  nion, the affini
18920 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ty string */.){.
18930 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
18940 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
18950 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
18960 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
18970 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ;     /* Return 
18980 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72  from sqlite3Wher
18990 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64  eBegin() */.  Vd
189a0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
189b0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
189c0 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65  ual machine unde
189d0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
189e0 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20  /.  int isAgg;  
189f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
18a00 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69  ue for select li
18a10 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  sts like "count(
18a20 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  *)" */.  ExprLis
18a30 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
18a40 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
18a50 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a  ns to extract. *
18a60 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
18a70 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69  bList;     /* Li
18a80 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
18a90 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
18aa0 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
18ab0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
18ac0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
18ad0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
18ae0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
18af0 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  y;    /* The ORD
18b00 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  ER BY clause.  M
18b10 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
18b20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
18b30 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52  By;    /* The GR
18b40 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
18b50 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
18b60 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20   Expr *pHaving; 
18b70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48          /* The H
18b80 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d  AVING clause.  M
18b90 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
18ba0 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20  int isDistinct; 
18bb0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
18bc0 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
18bd0 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
18be0 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69  t */.  int disti
18bf0 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nct;          /*
18c00 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f   Table to use fo
18c10 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
18c20 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  et */.  int rc =
18c30 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
18c40 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
18c50 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
18c60 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
18c70 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
18c80 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
18c90 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  n OP_OpenEphemer
18ca0 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a  al instruction *
18cb0 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67  /.  AggInfo sAgg
18cc0 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e  Info;      /* In
18cd0 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62  formation used b
18ce0 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  y aggregate quer
18cf0 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e  ies */.  int iEn
18d00 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
18d10 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18d20 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65  e end of the que
18d30 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ry */.  sqlite3 
18d40 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *db;           /
18d50 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
18d60 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
18d70 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
18d80 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64  .  if( p==0 || d
18d90 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18da0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
18db0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
18dc0 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
18dd0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
18de0 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
18df0 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
18e00 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74  turn 1;.  memset
18e10 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73  (&sAggInfo, 0, s
18e20 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29  izeof(sAggInfo))
18e30 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  ;..  pOrderBy = 
18e40 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
18e50 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
18e60 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
18e70 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
18e80 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68  0;..    /* In th
18e90 65 73 65 20 63 61 73 65 73 20 74 68 65 20 44 49  ese cases the DI
18ea0 53 54 49 4e 43 54 20 6f 70 65 72 61 74 6f 72 20  STINCT operator 
18eb0 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65  makes no differe
18ec0 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  nce to the.    *
18ed0 2a 20 72 65 73 75 6c 74 73 2c 20 73 6f 20 72 65  * results, so re
18ee0 6d 6f 76 65 20 69 74 20 69 66 20 69 74 20 77 65  move it if it we
18ef0 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20  re specified..  
18f00 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
18f10 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
18f20 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73  T_Exists || pDes
18f30 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e  t->eDest==SRT_Un
18f40 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ion || .        
18f50 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
18f60 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70  =SRT_Except || p
18f70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
18f80 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20 70  _Discard);.    p
18f90 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30  ->isDistinct = 0
18fa0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
18fb0 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65  te3SelectResolve
18fc0 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 20 29  (pParse, p, 0) )
18fd0 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
18fe0 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e  t_end;.  }.  p->
18ff0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
19000 72 42 79 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  rBy;..#ifndef SQ
19010 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
19020 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49  ND_SELECT.  /* I
19030 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61  f there is are a
19040 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65   sequence of que
19050 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72  ries, do the ear
19060 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e  lier ones first.
19070 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
19080 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
19090 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d   p->pRightmost==
190a0 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63  0 ){.      Selec
190b0 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69 67 68  t *pLoop, *pRigh
190c0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
190d0 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20   cnt = 0;.      
190e0 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f  for(pLoop=p; pLo
190f0 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
19100 3e 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b  >pPrior, cnt++){
19110 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
19120 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a  pRightmost = p;.
19130 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70          pLoop->p
19140 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  Next = pRight;. 
19150 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
19160 70 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  pLoop;.      }. 
19170 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
19180 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
19190 45 43 54 3e 30 20 26 26 20 63 6e 74 3e 53 51 4c  ECT>0 && cnt>SQL
191a0 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
191b0 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
191c0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
191d0 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
191e0 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f  many terms in co
191f0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b  mpound SELECT");
19200 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
19210 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
19220 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
19230 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
19240 70 2c 20 70 44 65 73 74 2c 20 61 66 66 29 3b 0a  p, pDest, aff);.
19250 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
19260 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69   Make local copi
19270 65 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65  es of the parame
19280 74 65 72 73 20 66 6f 72 20 74 68 69 73 20 71 75  ters for this qu
19290 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62  ery..  */.  pTab
192a0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
192b0 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
192c0 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79  here;.  pGroupBy
192d0 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
192e0 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
192f0 48 61 76 69 6e 67 3b 0a 20 20 69 73 41 67 67 20  Having;.  isAgg 
19300 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 69 73  = p->isAgg;.  is
19310 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
19320 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 45 4c 69  Distinct;.  pELi
19330 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
19340 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
19350 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
19360 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44  d;..  /* .  ** D
19370 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d  o not even attem
19380 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  pt to generate a
19390 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61  ny code if we ha
193a0 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a  ve already seen.
193b0 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f    ** errors befo
193c0 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
193d0 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69  starts..  */.  i
193e0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  f( pParse->nErr>
193f0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
19400 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72  end;..  /* If wr
19410 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20  iting to memory 
19420 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  or generating a 
19430 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20  set.  ** only a 
19440 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61  single column ma
19450 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  y be output..  *
19460 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
19470 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
19480 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c   if( checkForMul
19490 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
194a0 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73  ror(pParse, pDes
194b0 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
194c0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  ) ){.    goto se
194d0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
194e0 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52  ndif..  /* ORDER
194f0 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66   BY is ignored f
19500 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74  or some destinat
19510 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
19520 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62   IgnorableOrderb
19530 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
19540 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
19550 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  }..  /* Begin ge
19560 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
19570 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
19580 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
19590 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
195a0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
195b0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
195c0 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
195d0 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
195e0 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
195f0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
19600 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
19610 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
19620 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
19630 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
19640 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
19650 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
19660 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
19670 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69  ntext = 0;.    i
19680 6e 74 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f  nt needRestoreCo
19690 6e 74 65 78 74 3b 0a 20 20 20 20 73 74 72 75 63  ntext;.    struc
196a0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
196b0 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
196c0 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c  t->a[i];.    Sel
196d0 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 0a 20  ectDest dest;.. 
196e0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
196f0 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 49 74 65  elect==0 || pIte
19700 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 29  m->isPopulated )
19710 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
19720 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21  f( pItem->zName!
19730 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76  =0 ){.      zSav
19740 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
19750 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
19760 74 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72  text;.      pPar
19770 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
19780 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b   = pItem->zName;
19790 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f  .      needResto
197a0 72 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20  reContext = 1;. 
197b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
197c0 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
197d0 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 69  xt = 0;.    }.#i
197e0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
197f0 5f 54 45 53 54 29 20 7c 7c 20 53 51 4c 49 54 45  _TEST) || SQLITE
19800 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
19810 30 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  0.    /* Increme
19820 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74  nt Parse.nHeight
19830 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f   by the height o
19840 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78  f the largest ex
19850 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
19860 74 72 65 65 20 72 65 66 65 72 65 64 20 74 6f 20  tree refered to 
19870 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72  by this, the par
19880 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20  ent select. The 
19890 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20  child select.   
198a0 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   ** may contain 
198b0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
198c0 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20   of at most.    
198d0 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ** (SQLITE_MAX_E
198e0 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e  XPR_DEPTH-Parse.
198f0 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e  nHeight) height.
19900 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20   This is a bit. 
19910 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65     ** more conse
19920 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rvative than nec
19930 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68  essary, but much
19940 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66   easier than enf
19950 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  orcing.    ** an
19960 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20   exact limit..  
19970 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
19980 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69  >nHeight += sqli
19990 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
199a0 67 68 74 28 70 29 3b 0a 23 65 6e 64 69 66 0a 20  ght(p);.#endif. 
199b0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
199c0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
199d0 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49  SRT_EphemTab, pI
199e0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
199f0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
19a00 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
19a10 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 2c 20  pSelect, &dest, 
19a20 70 2c 20 69 2c 20 26 69 73 41 67 67 2c 20 30 29  p, i, &isAgg, 0)
19a30 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
19a40 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
19a50 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
19a60 65 6e 64 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64  end;.    }.#if d
19a70 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
19a80 53 54 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  ST) || SQLITE_MA
19a90 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20  X_EXPR_DEPTH>0. 
19aa0 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
19ab0 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht -= sqlite3Sel
19ac0 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
19ad0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
19ae0 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
19af0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ext ){.      pPa
19b00 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
19b10 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
19b20 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ntext;.    }.   
19b30 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
19b40 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65 20  Src;.    pWhere 
19b50 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  = p->pWhere;.   
19b60 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f   if( !IgnorableO
19b70 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
19b80 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
19b90 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
19ba0 20 20 20 7d 0a 20 20 20 20 70 47 72 6f 75 70 42     }.    pGroupB
19bb0 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
19bc0 0a 20 20 20 20 70 48 61 76 69 6e 67 20 3d 20 70  .    pHaving = p
19bd0 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 69  ->pHaving;.    i
19be0 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
19bf0 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 23  sDistinct;.  }.#
19c00 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63  endif..  /* Chec
19c10 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 61  k for the specia
19c20 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e 28  l case of a min(
19c30 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74  ) or max() funct
19c40 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20 20  ion by itself.  
19c50 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
19c60 20 73 65 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 30   set..  */.#if 0
19c70 0a 20 20 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e  .  if( simpleMin
19c80 4d 61 78 51 75 65 72 79 28 70 50 61 72 73 65 2c  MaxQuery(pParse,
19c90 20 70 2c 20 70 44 65 73 74 29 20 29 7b 0a 20 20   p, pDest) ){.  
19ca0 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f    rc = 0;.    go
19cb0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
19cc0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
19cd0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
19ce0 74 68 69 73 20 69 73 20 61 20 73 75 62 71 75 65  this is a subque
19cf0 72 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 22  ry that can be "
19d00 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20  flattened" into 
19d10 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a  its parent..  **
19d20 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
19d30 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20  s a possiblity, 
19d40 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e  do so and return
19d50 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a   immediately.  .
19d60 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
19d70 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
19d80 69 66 28 20 70 50 61 72 65 6e 74 20 26 26 20 70  if( pParent && p
19d90 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20  ParentAgg &&.   
19da0 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65     flattenSubque
19db0 72 79 28 64 62 2c 20 70 50 61 72 65 6e 74 2c 20  ry(db, pParent, 
19dc0 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72  parentTab, *pPar
19dd0 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20 29  entAgg, isAgg) )
19de0 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  {.    if( isAgg 
19df0 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20  ) *pParentAgg = 
19e00 31 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  1;.    goto sele
19e10 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
19e20 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 6f 73 73  if..  /* If poss
19e30 69 62 6c 65 2c 20 72 65 77 72 69 74 65 20 74 68  ible, rewrite th
19e40 65 20 71 75 65 72 79 20 74 6f 20 75 73 65 20 47  e query to use G
19e50 52 4f 55 50 20 42 59 20 69 6e 73 74 65 61 64 20  ROUP BY instead 
19e60 6f 66 20 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a  of DISTINCT..  *
19e70 2a 20 47 52 4f 55 50 20 42 59 20 6d 61 79 20 75  * GROUP BY may u
19e80 73 65 20 61 6e 20 69 6e 64 65 78 2c 20 44 49 53  se an index, DIS
19e90 54 49 4e 43 54 20 6e 65 76 65 72 20 64 6f 65 73  TINCT never does
19ea0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
19eb0 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 21 70  isDistinct && !p
19ec0 2d 3e 69 73 41 67 67 20 26 26 20 21 70 2d 3e 70  ->isAgg && !p->p
19ed0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 70  GroupBy ){.    p
19ee0 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
19ef0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
19f00 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  db, p->pEList);.
19f10 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
19f20 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
19f30 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20  p->isDistinct = 
19f40 30 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63  0;.    isDistinc
19f50 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t = 0;.  }..  /*
19f60 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
19f70 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
19f80 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69   then this sorti
19f90 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69  ng.  ** index mi
19fa0 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ght end up being
19fb0 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64   unused if the d
19fc0 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a  ata can be .  **
19fd0 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72   extracted in pr
19fe0 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20  e-sorted order. 
19ff0 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
1a000 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  case, then the. 
1a010 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   ** OP_OpenEphem
1a020 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
1a030 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
1a040 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f   to an OP_Noop o
1a050 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75  nce.  ** we figu
1a060 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  re out that the 
1a070 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73  sorting index is
1a080 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68   not needed.  Th
1a090 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a  e addrSortIndex.
1a0a0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73    ** variable is
1a0b0 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74   used to facilit
1a0c0 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e  ate that change.
1a0d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
1a0e0 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
1a0f0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
1a100 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
1a110 45 72 72 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Err ){.      got
1a120 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1a130 20 20 7d 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f    }.    pKeyInfo
1a140 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
1a150 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
1a160 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f  OrderBy);.    pO
1a170 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
1a180 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1a190 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  +;.    p->addrOp
1a1a0 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72  enEphm[2] = addr
1a1b0 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20  SortIndex =.    
1a1c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a1d0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
1a1e0 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a200 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45      pOrderBy->iE
1a210 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79  Cursor, pOrderBy
1a220 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20  ->nExpr+2, 0,.  
1a230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a240 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
1a250 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
1a260 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
1a270 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
1a280 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a  SortIndex = -1;.
1a290 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1a2a0 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
1a2b0 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
1a2c0 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
1a2d0 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
1a2e0 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
1a2f0 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
1a300 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
1a310 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a320 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
1a330 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 70 45  pDest->iParm, pE
1a340 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
1a350 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
1a360 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  limiter..  */.  
1a370 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  iEnd = sqlite3Vd
1a380 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1a390 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
1a3a0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
1a3b0 70 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  p, iEnd);..  /* 
1a3c0 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20 69  Open a virtual i
1a3d0 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
1a3e0 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74  the distinct set
1a3f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44  ..  */.  if( isD
1a400 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b  istinct ){.    K
1a410 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1a420 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
1a430 41 67 67 20 7c 7c 20 70 47 72 6f 75 70 42 79 20  Agg || pGroupBy 
1a440 29 3b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  );.    distinct 
1a450 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
1a460 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
1a470 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
1a480 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  List(pParse, p->
1a490 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
1a4a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1a4b0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
1a4c0 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 2c  al, distinct, 0,
1a4d0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1a4e0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
1a4f0 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
1a500 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
1a510 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
1a520 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
1a530 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61 74  }..  /* Aggregat
1a540 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67  e and non-aggreg
1a550 61 74 65 20 71 75 65 72 69 65 73 20 61 72 65 20  ate queries are 
1a560 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
1a570 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  tly */.  if( !is
1a580 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d  Agg && pGroupBy=
1a590 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
1a5a0 73 20 63 61 73 65 20 69 73 20 66 6f 72 20 6e 6f  s case is for no
1a5b0 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n-aggregate quer
1a5c0 69 65 73 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e  ies.    ** Begin
1a5d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1a5e0 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 57  an.    */.    pW
1a5f0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
1a600 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
1a610 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
1a620 65 2c 20 26 70 4f 72 64 65 72 42 79 2c 20 30 29  e, &pOrderBy, 0)
1a630 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
1a640 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
1a650 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 49  t_end;..    /* I
1a660 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  f sorting index 
1a670 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64  that was created
1a680 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f   by a prior OP_O
1a690 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20  penEphemeral .  
1a6a0 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
1a6b0 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65   ended up not be
1a6c0 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e  ing needed, then
1a6d0 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f   change the OP_O
1a6e0 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20  penEphemeral.   
1a6f0 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e   ** into an OP_N
1a700 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
1a710 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64 65  if( addrSortInde
1a720 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79  x>=0 && pOrderBy
1a730 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
1a740 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
1a750 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  Noop(v, addrSort
1a760 49 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20 20 20  Index, 1);.     
1a770 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
1a780 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  [2] = -1;.    }.
1a790 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
1a7a0 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c  standard inner l
1a7b0 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  oop.    */.    a
1a7c0 73 73 65 72 74 28 21 69 73 44 69 73 74 69 6e 63  ssert(!isDistinc
1a7d0 74 29 3b 0a 20 20 20 20 69 66 28 20 73 65 6c 65  t);.    if( sele
1a7e0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
1a7f0 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30  se, p, pEList, 0
1a800 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 2d  , 0, pOrderBy, -
1a810 31 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  1, pDest,.      
1a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
1a830 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c  Info->iContinue,
1a840 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c   pWInfo->iBreak,
1a850 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20   aff) ){.       
1a860 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1a870 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45  .    }..    /* E
1a880 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
1a890 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
1a8a0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  /.    sqlite3Whe
1a8b0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
1a8c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
1a8d0 68 69 73 20 69 73 20 74 68 65 20 70 72 6f 63 65  his is the proce
1a8e0 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  ssing for aggreg
1a8f0 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  ate queries */. 
1a900 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
1a910 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63  NC;    /* Name c
1a920 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65  ontext for proce
1a930 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20  ssing aggregate 
1a940 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
1a950 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20     int iAMem;   
1a960 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1a970 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
1a980 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20  storing current 
1a990 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
1a9a0 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20  int iBMem;      
1a9b0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
1a9c0 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65   address for pre
1a9d0 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a  vious GROUP BY *
1a9e0 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c  /.    int iUseFl
1a9f0 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  ag;       /* Mem
1aa00 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67   address holding
1aa10 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67   flag indicating
1aa20 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20   that at least. 
1aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa40 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f         ** one ro
1aa50 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74  w of the input t
1aa60 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72  o the aggregator
1aa70 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20   has been.      
1aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa90 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a    ** processed *
1aaa0 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74  /.    int iAbort
1aab0 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d  Flag;     /* Mem
1aac0 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63   address which c
1aad0 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72  auses query abor
1aae0 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f  t if positive */
1aaf0 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79  .    int groupBy
1ab00 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73  Sort;    /* Rows
1ab10 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63   come from sourc
1ab20 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  e in GROUP BY or
1ab30 64 65 72 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 20  der */...    /* 
1ab40 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
1ab50 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 61 64 64  riables hold add
1ab60 72 65 73 73 65 73 20 6f 72 20 6c 61 62 65 6c 73  resses or labels
1ab70 20 66 6f 72 20 70 61 72 74 73 20 6f 66 20 74 68   for parts of th
1ab80 65 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  e.    ** virtual
1ab90 20 6d 61 63 68 69 6e 65 20 70 72 6f 67 72 61 6d   machine program
1aba0 20 77 65 20 61 72 65 20 70 75 74 74 69 6e 67 20   we are putting 
1abb0 74 6f 67 65 74 68 65 72 20 2a 2f 0a 20 20 20 20  together */.    
1abc0 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f  int addrOutputRo
1abd0 77 3b 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  w;      /* Start
1abe0 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74   of subroutine t
1abf0 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65  hat outputs a re
1ac00 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  sult row */.    
1ac10 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74  int addrSetAbort
1ac20 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ;       /* Set t
1ac30 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e  he abort flag an
1ac40 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20  d return */.    
1ac50 69 6e 74 20 61 64 64 72 49 6e 69 74 69 61 6c 69  int addrInitiali
1ac60 7a 65 4c 6f 6f 70 3b 20 2f 2a 20 53 74 61 72 74  zeLoop; /* Start
1ac70 20 6f 66 20 63 6f 64 65 20 74 68 61 74 20 69 6e   of code that in
1ac80 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 69 6e  itializes the in
1ac90 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  put loop */.    
1aca0 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  int addrTopOfLoo
1acb0 70 3b 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f  p;      /* Top o
1acc0 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70  f the input loop
1acd0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
1ace0 47 72 6f 75 70 42 79 43 68 61 6e 67 65 3b 20 20  GroupByChange;  
1acf0 2f 2a 20 43 6f 64 65 20 74 68 61 74 20 72 75 6e  /* Code that run
1ad00 73 20 77 68 65 6e 20 61 6e 79 20 47 52 4f 55 50  s when any GROUP
1ad10 20 42 59 20 74 65 72 6d 20 63 68 61 6e 67 65 73   BY term changes
1ad20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
1ad30 50 72 6f 63 65 73 73 52 6f 77 3b 20 20 20 20 20  ProcessRow;     
1ad40 2f 2a 20 43 6f 64 65 20 74 6f 20 70 72 6f 63 65  /* Code to proce
1ad50 73 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 70 75  ss a single inpu
1ad60 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  t row */.    int
1ad70 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20   addrEnd;       
1ad80 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 61       /* End of a
1ad90 6c 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  ll processing */
1ada0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72  .    int addrSor
1adb0 74 69 6e 67 49 64 78 3b 20 20 20 20 20 2f 2a 20  tingIdx;     /* 
1adc0 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
1add0 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72  eral for the sor
1ade0 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ting index */.  
1adf0 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b    int addrReset;
1ae00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
1ae10 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65  routine for rese
1ae20 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75  tting the accumu
1ae30 6c 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 61 64  lator */..    ad
1ae40 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  drEnd = sqlite3V
1ae50 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1ae60 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
1ae70 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
1ae80 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
1ae90 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74  UMN and make ent
1aea0 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73  ries in.    ** s
1aeb0 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20  AggInfo for all 
1aec0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
1aed0 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73  nodes in express
1aee0 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ions of the.    
1aef0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
1af00 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
1af10 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
1af20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
1af30 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
1af40 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
1af50 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
1af60 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67  st;.    sNC.pAgg
1af70 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f  Info = &sAggInfo
1af80 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  ;.    sAggInfo.n
1af90 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20  SortingColumn = 
1afa0 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75  pGroupBy ? pGrou
1afb0 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30  pBy->nExpr+1 : 0
1afc0 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70  ;.    sAggInfo.p
1afd0 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
1afe0 42 79 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  By;.    if( sqli
1aff0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
1b000 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69  gList(&sNC, pELi
1b010 73 74 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  st) ){.      got
1b020 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1b030 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
1b040 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
1b050 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64  gList(&sNC, pOrd
1b060 65 72 42 79 29 20 29 7b 0a 20 20 20 20 20 20 67  erBy) ){.      g
1b070 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
1b080 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48      }.    if( pH
1b090 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65 33  aving && sqlite3
1b0a0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
1b0b0 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76  gates(&sNC, pHav
1b0c0 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ing) ){.      go
1b0d0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
1b0e0 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
1b0f0 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d  o.nAccumulator =
1b100 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d   sAggInfo.nColum
1b110 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  n;.    for(i=0; 
1b120 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  i<sAggInfo.nFunc
1b130 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
1b140 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  ( sqlite3ExprAna
1b150 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
1b160 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
1b170 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74  [i].pExpr->pList
1b180 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ) ){.        got
1b190 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1b1a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b1b0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1b1c0 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
1b1d0 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20  ct_end;..    /* 
1b1e0 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  Processing for a
1b1f0 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47  ggregates with G
1b200 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20  ROUP BY is very 
1b210 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20  different and.  
1b220 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63    ** much more c
1b230 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72  omplex than aggr
1b240 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
1b250 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
1b260 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
1b270 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
1b280 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
1b290 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
1b2a0 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
1b2b0 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
1b2c0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  ..      /* Creat
1b2d0 65 20 6c 61 62 65 6c 73 20 74 68 61 74 20 77 65  e labels that we
1b2e0 20 77 69 6c 6c 20 62 65 20 6e 65 65 64 69 6e 67   will be needing
1b2f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 0a  .      */.     .
1b300 20 20 20 20 20 20 61 64 64 72 49 6e 69 74 69 61        addrInitia
1b310 6c 69 7a 65 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  lizeLoop = sqlit
1b320 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1b330 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72 47 72  v);.      addrGr
1b340 6f 75 70 42 79 43 68 61 6e 67 65 20 3d 20 73 71  oupByChange = sq
1b350 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1b360 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64  el(v);.      add
1b370 72 50 72 6f 63 65 73 73 52 6f 77 20 3d 20 73 71  rProcessRow = sq
1b380 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1b390 65 6c 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  el(v);..      /*
1b3a0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47   If there is a G
1b3b0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77  ROUP BY clause w
1b3c0 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73  e might need a s
1b3d0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a  orting index to.
1b3e0 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
1b3f0 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65  nt it.  Allocate
1b400 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e   that sorting in
1b410 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20  dex now.  If it 
1b420 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20  turns out.      
1b430 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
1b440 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20  t need it after 
1b450 61 6c 6c 2c 20 74 68 65 20 4f 70 65 6e 45 70 68  all, the OpenEph
1b460 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
1b470 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  on.      ** will
1b480 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
1b490 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20  to a Noop.  .   
1b4a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67     */.      sAgg
1b4b0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20  Info.sortingIdx 
1b4c0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
1b4d0 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
1b4e0 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
1b4f0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
1b500 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
1b510 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d  addrSortingIdx =
1b520 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1b530 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1b540 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1b550 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
1b560 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20  ngIdx,.         
1b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b580 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
1b590 67 43 6f 6c 75 6d 6e 2c 20 30 2c 0a 20 20 20 20  gColumn, 0,.    
1b5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5b0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
1b5c0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
1b5d0 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20  _HANDOFF);..    
1b5e0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1b5f0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73  memory locations
1b600 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42   used by GROUP B
1b610 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63  Y aggregate proc
1b620 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a  essing.      */.
1b630 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d        iUseFlag =
1b640 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1b650 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61  .      iAbortFla
1b660 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
1b670 65 6d 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20  em;.      iAMem 
1b680 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
1b690 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
1b6a0 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
1b6b0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
1b6c0 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iBMem = pParse-
1b6d0 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
1b6e0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
1b6f0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
1b700 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1b710 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b720 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f  Integer, 0, iAbo
1b730 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
1b740 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1b750 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67  clear abort flag
1b760 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
1b770 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b780 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
1b790 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
1b7a0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1b7b0 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75  "indicate accumu
1b7c0 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a  lator empty"));.
1b7d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b7e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1b7f0 74 6f 2c 20 30 2c 20 61 64 64 72 49 6e 69 74 69  to, 0, addrIniti
1b800 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 0a 20 20 20  alizeLoop);..   
1b810 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
1b820 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
1b830 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c   outputs a singl
1b840 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
1b850 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
1b860 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69  .  This subrouti
1b870 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61  ne first looks a
1b880 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20  t the iUseFlag. 
1b890 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20   If iUseFlag.   
1b8a0 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68     ** is less th
1b8b0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
1b8c0 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ero, the subrout
1b8d0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ine is a no-op. 
1b8e0 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   If.      ** the
1b8f0 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c   processing call
1b900 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20  s for the query 
1b910 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73  to abort, this s
1b920 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  ubroutine.      
1b930 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68  ** increments th
1b940 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d  e iAbortFlag mem
1b950 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66  ory location bef
1b960 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ore returning in
1b970 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20  .      ** order 
1b980 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61  to signal the ca
1b990 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20  ller to abort.. 
1b9a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
1b9b0 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c  drSetAbort = sql
1b9c0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1b9d0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
1b9e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b9f0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
1ba00 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
1ba10 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1ba20 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20  ((v, "set abort 
1ba30 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
1ba40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ba50 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30  (v, OP_Return, 0
1ba60 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72  , 0);.      addr
1ba70 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69  OutputRow = sqli
1ba80 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1ba90 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
1baa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1bab0 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65  , OP_IfPos, iUse
1bac0 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74  Flag, addrOutput
1bad0 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64  Row+2);.      Vd
1bae0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
1baf0 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65  roupby result ge
1bb00 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f  nerator entry po
1bb10 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71  int"));.      sq
1bb20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1bb30 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c  v, OP_Return, 0,
1bb40 20 30 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c   0);.      final
1bb50 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
1bb60 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
1bb70 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48  o);.      if( pH
1bb80 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  aving ){.       
1bb90 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1bba0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
1bbb0 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  ing, addrOutputR
1bbc0 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  ow+1, SQLITE_JUM
1bbd0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
1bbe0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c  }.      rc = sel
1bbf0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
1bc00 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
1bc10 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42  t, 0, 0, pOrderB
1bc20 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
1bc40 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc60 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75            addrOu
1bc70 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53  tputRow+1, addrS
1bc80 65 74 41 62 6f 72 74 2c 20 61 66 66 29 3b 0a 20  etAbort, aff);. 
1bc90 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1bca0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
1bcb0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
1bcc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1bcd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
1bce0 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  turn, 0, 0);.   
1bcf0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1bd00 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20  v, "end groupby 
1bd10 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
1bd20 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  "));..      /* G
1bd30 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
1bd40 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
1bd50 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62  eset the group-b
1bd60 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20  y accumulator.  
1bd70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
1bd80 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33  rReset = sqlite3
1bd90 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1bda0 76 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41  v);.      resetA
1bdb0 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
1bdc0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
1bdd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1bde0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 74  AddOp2(v, OP_Ret
1bdf0 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  urn, 0, 0);..   
1be00 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
1be10 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
1be20 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
1be30 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
1be40 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
1be50 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
1be60 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
1be70 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
1be80 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
1be90 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
1bea0 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
1beb0 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
1bec0 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
1bed0 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
1bee0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
1bef0 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
1bf00 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
1bf10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
1bf20 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1bf30 61 62 65 6c 28 76 2c 20 61 64 64 72 49 6e 69 74  abel(v, addrInit
1bf40 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20  ializeLoop);.   
1bf50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bf60 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1bf70 2c 20 30 2c 20 61 64 64 72 52 65 73 65 74 29 3b  , 0, addrReset);
1bf80 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  .      pWInfo = 
1bf90 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1bfa0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
1bfb0 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 47 72  st, pWhere, &pGr
1bfc0 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 20  oupBy, 0);.     
1bfd0 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
1bfe0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1bff0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72 6f  ;.      if( pGro
1c000 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  upBy==0 ){.     
1c010 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69     /* The optimi
1c020 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64  zer is able to d
1c030 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67  eliver rows in g
1c040 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f  roup by order so
1c050 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64  .        ** we d
1c060 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f  o not have to so
1c070 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e  rt.  The OP_Open
1c080 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  Ephemeral table 
1c090 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
1c0a0 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74  ** cancelled lat
1c0b0 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74  er because we st
1c0c0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20  ill need to use 
1c0d0 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20  the pKeyInfo.   
1c0e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1c0f0 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
1c100 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
1c110 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b  groupBySort = 0;
1c120 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c130 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72        /* Rows ar
1c140 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20  e coming out in 
1c150 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64  undetermined ord
1c160 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  er.  We have to 
1c170 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  push.        ** 
1c180 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20  each row into a 
1c190 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74  sorting index, t
1c1a0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72  erminate the fir
1c1b0 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  st loop,.       
1c1c0 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76   ** then loop ov
1c1d0 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  er the sorting i
1c1e0 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f  ndex in order to
1c1f0 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a   get the output.
1c200 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f          ** in so
1c210 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20  rted order.     
1c220 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
1c230 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20  t regBase;.     
1c240 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64     int regRecord
1c250 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ;.        int nC
1c260 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ol;.        int 
1c270 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20  nGroupBy;..     
1c280 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
1c290 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f   1;.        nGro
1c2a0 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d  upBy = pGroupBy-
1c2b0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
1c2c0 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20  nCol = nGroupBy 
1c2d0 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  + 1;.        j =
1c2e0 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20   nGroupBy+1;.   
1c2f0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1c300 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
1c310 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1c320 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61    if( sAggInfo.a
1c330 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f  Col[i].iSorterCo
1c340 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
1c350 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20         nCol++;. 
1c360 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a             j++;.
1c370 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c380 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
1c390 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47  gBase = sqlite3G
1c3a0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
1c3b0 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  se, nCol);.     
1c3c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1c3d0 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
1c3e0 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67  e, pGroupBy, reg
1c3f0 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  Base);.        s
1c400 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1c410 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
1c420 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
1c430 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72  gIdx,regBase+nGr
1c440 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20  oupBy);.        
1c450 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a  j = nGroupBy+1;.
1c460 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1c470 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
1c480 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
1c490 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
1c4a0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
1c4b0 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69  &sAggInfo.aCol[i
1c4c0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
1c4d0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
1c4e0 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
1c4f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1c500 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
1c510 76 2c 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70  v, pCol->pTab, p
1c520 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43  Col->iColumn, pC
1c530 6f 6c 2d 3e 69 54 61 62 6c 65 2c 0a 20 20 20 20  ol->iTable,.    
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c560 20 6a 20 2b 20 72 65 67 42 61 73 65 29 3b 0a 20   j + regBase);. 
1c570 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a             j++;.
1c580 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c590 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
1c5a0 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
1c5b0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
1c5c0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
1c5d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1c5e0 2c 20 4f 50 5f 52 65 67 4d 61 6b 65 52 65 63 2c  , OP_RegMakeRec,
1c5f0 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20   regBase, nCol, 
1c600 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
1c610 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c620 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
1c630 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  nsert, sAggInfo.
1c640 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52  sortingIdx, regR
1c650 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
1c660 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1c670 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1c680 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
1c690 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1c6a0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
1c6b0 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29  , regBase, nCol)
1c6c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1c6d0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
1c6e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1c6f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1c700 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e 66  OP_Sort, sAggInf
1c710 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
1c720 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  drEnd);.        
1c730 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1c740 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29  "GROUP BY sort")
1c750 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49  );.        sAggI
1c760 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64  nfo.useSortingId
1c770 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a  x = 1;.      }..
1c780 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
1c790 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
1c7a0 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64  OUP BY terms and
1c7b0 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31   store in b0, b1
1c7c0 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  , b2....      **
1c7d0 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c   (b0 is memory l
1c7e0 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c  ocation iBMem+0,
1c7f0 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20   b1 is iBMem+1, 
1c800 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20  and so forth).  
1c810 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70      ** Then comp
1c820 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  are the current 
1c830 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61  GROUP BY terms a
1c840 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50  gainst the GROUP
1c850 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20   BY terms.      
1c860 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  ** from the prev
1c870 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74  ious row current
1c880 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c  ly stored in a0,
1c890 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20   a1, a2....     
1c8a0 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f   */.      addrTo
1c8b0 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65  pOfLoop = sqlite
1c8c0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1c8d0 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  (v);.      for(j
1c8e0 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; j<pGroupBy->
1c8f0 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
1c900 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
1c910 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
1c920 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c930 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op2(v, OP_Column
1c940 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
1c950 6e 67 49 64 78 2c 20 6a 29 3b 0a 20 20 20 20 20  ngIdx, j);.     
1c960 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c970 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72      sAggInfo.dir
1c980 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ectMode = 1;.   
1c990 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1c9a0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1c9b0 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45  GroupBy->a[j].pE
1c9c0 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
1c9d0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1c9e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1c9f0 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
1ca00 72 2d 31 3f 4f 50 5f 4d 6f 76 65 3a 4f 50 5f 43  r-1?OP_Move:OP_C
1ca10 6f 70 79 2c 20 30 2c 20 69 42 4d 65 6d 2b 6a 29  opy, 0, iBMem+j)
1ca20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ca30 66 6f 72 28 6a 3d 70 47 72 6f 75 70 42 79 2d 3e  for(j=pGroupBy->
1ca40 6e 45 78 70 72 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  nExpr-1; j>=0; j
1ca50 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  --){.        if(
1ca60 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
1ca70 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  pr-1 ){.        
1ca80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ca90 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
1caa0 20 69 42 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20   iBMem+j, 0);.  
1cab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1cac0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cad0 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  2(v, OP_SCopy, i
1cae0 41 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20 20  AMem+j, 0);.    
1caf0 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 7b 0a      if( j==0 ){.
1cb00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1cb10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1cb20 50 5f 45 71 2c 20 30 2c 20 61 64 64 72 50 72 6f  P_Eq, 0, addrPro
1cb30 63 65 73 73 52 6f 77 29 3b 0a 20 20 20 20 20 20  cessRow);.      
1cb40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1cb50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cb60 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 2c 20 30  dOp2(v, OP_Ne, 0
1cb70 2c 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61  , addrGroupByCha
1cb80 6e 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nge);.        }.
1cb90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1cba0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
1cbb0 31 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e  1, (void*)pKeyIn
1cbc0 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 2c 20 50 34  fo->aColl[j], P4
1cbd0 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
1cbe0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1cbf0 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
1cc00 5f 4e 55 4c 4c 45 51 55 41 4c 29 3b 0a 20 20 20  _NULLEQUAL);.   
1cc10 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
1cc20 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
1cc30 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20  t runs whenever 
1cc40 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61  the GROUP BY cha
1cc50 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43  nges..      ** C
1cc60 68 61 6e 67 65 20 69 6e 20 74 68 65 20 47 52 4f  hange in the GRO
1cc70 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74  UP BY are detect
1cc80 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
1cc90 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a  us code.      **
1cca0 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72   block.  If ther
1ccb0 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65  e were no change
1ccc0 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73  s, this block is
1ccd0 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20   skipped..      
1cce0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  **.      ** This
1ccf0 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72   code copies cur
1cd00 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65  rent group by te
1cd10 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c  rms in b0,b1,b2,
1cd20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ....      ** ove
1cd30 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20  r to a0,a1,a2.  
1cd40 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68  It then calls th
1cd50 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
1cd60 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ine.      ** and
1cd70 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72   resets the aggr
1cd80 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
1cd90 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70  r registers in p
1cda0 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20  reparation.     
1cdb0 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74   ** for the next
1cdc0 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e   GROUP BY batch.
1cdd0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1cde0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1cdf0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 47  veLabel(v, addrG
1ce00 72 6f 75 70 42 79 43 68 61 6e 67 65 29 3b 0a 20  roupByChange);. 
1ce10 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1ce20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
1ce30 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   j++){.        s
1ce40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ce50 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 42 4d  (v, OP_Move, iBM
1ce60 65 6d 2b 6a 2c 20 69 41 4d 65 6d 2b 6a 29 3b 0a  em+j, iAMem+j);.
1ce70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1ce80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ce90 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
1cea0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
1ceb0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1cec0 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e  t((v, "output on
1ced0 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20  e row"));.      
1cee0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cef0 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
1cf00 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45  AbortFlag, addrE
1cf10 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  nd);.      VdbeC
1cf20 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63  omment((v, "chec
1cf30 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  k abort flag"));
1cf40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1cf50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1cf60 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 52 65 73  osub, 0, addrRes
1cf70 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
1cf80 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65  omment((v, "rese
1cf90 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  t accumulator"))
1cfa0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ;..      /* Upda
1cfb0 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65  te the aggregate
1cfc0 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61   accumulators ba
1cfd0 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
1cfe0 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  nt of.      ** t
1cff0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20  he current row. 
1d000 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
1d010 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1d020 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 50 72 6f  Label(v, addrPro
1d030 63 65 73 73 52 6f 77 29 3b 0a 20 20 20 20 20 20  cessRow);.      
1d040 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
1d050 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
1d060 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
1d070 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d080 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
1d090 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
1d0a0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1d0b0 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20   "indicate data 
1d0c0 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  in accumulator")
1d0d0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64  );..      /* End
1d0e0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20   of the loop.   
1d0f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1d100 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
1d110 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1d120 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1d130 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ext, sAggInfo.so
1d140 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f  rtingIdx, addrTo
1d150 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  pOfLoop);.      
1d160 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1d170 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
1d180 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
1d190 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1d1a0 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53  eToNoop(v, addrS
1d1b0 6f 72 74 69 6e 67 49 64 78 2c 20 31 29 3b 0a 20  ortingIdx, 1);. 
1d1c0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1d1d0 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61   Output the fina
1d1e0 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a  l row of result.
1d1f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
1d200 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d210 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c  (v, OP_Gosub, 0,
1d220 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
1d230 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1d240 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66  nt((v, "output f
1d250 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 20 20 20  inal row"));.   
1d260 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64     .    } /* end
1d270 69 66 20 70 47 72 6f 75 70 42 79 20 2a 2f 0a 20  if pGroupBy */. 
1d280 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20     else {.      
1d290 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61  ExprList *pMinMa
1d2a0 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70  x = 0;.      Exp
1d2b0 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b  rList *pDel = 0;
1d2c0 0a 20 20 20 20 20 20 75 38 20 66 6c 61 67 3b 0a  .      u8 flag;.
1d2d0 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
1d2e0 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  if the query is 
1d2f0 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  of one of the fo
1d300 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20  llowing forms:. 
1d310 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1d320 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29     SELECT min(x)
1d330 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20   FROM ....      
1d340 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28  **   SELECT max(
1d350 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20  x) FROM ....    
1d360 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
1d370 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b   it is, then ask
1d380 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65   the code in whe
1d390 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20  re.c to attempt 
1d3a0 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a  to sort results.
1d3b0 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74        ** as if t
1d3c0 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44  here was an "ORD
1d3d0 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44  ER ON x" or "ORD
1d3e0 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c  ER ON x DESC" cl
1d3f0 61 75 73 65 2e 20 0a 20 20 20 20 20 20 2a 2a 20  ause. .      ** 
1d400 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62  If where.c is ab
1d410 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65  le to produce re
1d420 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20  sults sorted in 
1d430 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e  this order, then
1d440 0a 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64  .      ** add vd
1d450 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b  be code to break
1d460 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63   out of the proc
1d470 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65  essing loop afte
1d480 72 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  r the .      ** 
1d490 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
1d4a0 28 73 69 6e 63 65 20 74 68 65 20 66 69 72 73 74  (since the first
1d4b0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
1d4c0 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20  e loop is .     
1d4d0 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74   ** guaranteed t
1d4e0 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
1d4f0 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69   row with the mi
1d500 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d  nimum or maximum
1d510 20 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65   .      ** value
1d520 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20   of x, the only 
1d530 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20  row required).. 
1d540 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1d550 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20   A special flag 
1d560 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20 74  must be passed t
1d570 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
1d580 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c  gin() to slightl
1d590 79 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66  y.      ** modif
1d5a0 79 20 62 65 68 61 76 69 6f 75 72 20 61 73 20 66  y behaviour as f
1d5b0 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a  ollows:.      **
1d5c0 0a 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66  .      **   + If
1d5d0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20   the query is a 
1d5e0 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c  "SELECT min(x)",
1d5f0 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63   then the loop c
1d600 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  oded by.      **
1d610 20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f       where.c sho
1d620 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20  uld not iterate 
1d630 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20  over any values 
1d640 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75  with a NULL valu
1d650 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66  e.      **     f
1d660 6f 72 20 78 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  or x..      **. 
1d670 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20       **   + The 
1d680 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69  optimizer code i
1d690 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20 74  n where.c (the t
1d6a0 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64 65  hing that decide
1d6b0 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a  s which.      **
1d6c0 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e       index or in
1d6d0 64 69 63 65 73 20 74 6f 20 75 73 65 29 20 73 68  dices to use) sh
1d6e0 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66  ould place a dif
1d6f0 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20  ferent priority 
1d700 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  on .      **    
1d710 20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20   satisfying the 
1d720 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73  'ORDER BY' claus
1d730 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69  e than it does i
1d740 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20  n other cases.. 
1d750 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65       **     Refe
1d760 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f  r to code and co
1d770 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e  mments in where.
1d780 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20  c for details.. 
1d790 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6c       */.      fl
1d7a0 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79  ag = minMaxQuery
1d7b0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
1d7c0 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20     if( flag ){. 
1d7d0 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d         pMinMax =
1d7e0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1d7f0 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  Dup(db, p->pELis
1d800 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 70  t->a[0].pExpr->p
1d810 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69  List);.        i
1d820 66 28 20 70 4d 69 6e 4d 61 78 20 29 7b 0a 20 20  f( pMinMax ){.  
1d830 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d          pMinMax-
1d840 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
1d850 3d 20 28 28 66 6c 61 67 3d 3d 4f 52 44 45 52 42  = ((flag==ORDERB
1d860 59 5f 4d 49 4e 29 3f 30 3a 31 29 3b 0a 20 20 20  Y_MIN)?0:1);.   
1d870 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
1d880 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d  a[0].pExpr->op =
1d890 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
1d8a0 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69        pDel = pMi
1d8b0 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nMax;.        }.
1d8c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1d8d0 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73  * This case runs
1d8e0 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74   if the aggregat
1d8f0 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42  e has no GROUP B
1d900 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20  Y clause.  The. 
1d910 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
1d920 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c  ng is much simpl
1d930 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  er since there i
1d940 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
1d950 72 6f 77 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  row.      ** of 
1d960 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2f  output..      */
1d970 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75  .      resetAccu
1d980 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
1d990 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
1d9a0 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
1d9b0 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
1d9c0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
1d9d0 57 68 65 72 65 2c 20 26 70 4d 69 6e 4d 61 78 2c  Where, &pMinMax,
1d9e0 20 66 6c 61 67 29 3b 0a 20 20 20 20 20 20 69 66   flag);.      if
1d9f0 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  ( pWInfo==0 ){. 
1da00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1da10 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 44 65  prListDelete(pDe
1da20 6c 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  l);.        goto
1da30 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
1da40 20 20 20 7d 0a 20 20 20 20 20 20 75 70 64 61 74     }.      updat
1da50 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
1da60 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
1da70 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d 69 6e  .      if( !pMin
1da80 4d 61 78 20 26 26 20 66 6c 61 67 20 29 7b 0a 20  Max && flag ){. 
1da90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1daa0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1dab0 6f 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e  oto, 0, pWInfo->
1dac0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
1dad0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1dae0 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78 22   "%s() by index"
1daf0 2c 20 28 66 6c 61 67 3d 3d 4f 52 44 45 52 42 59  , (flag==ORDERBY
1db00 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22  _MIN?"min":"max"
1db10 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )));.      }.   
1db20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
1db30 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
1db40 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e    finalizeAggFun
1db50 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26  ctions(pParse, &
1db60 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
1db70 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
1db80 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67       if( pHaving
1db90 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1dba0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1dbb0 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
1dbc0 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f  addrEnd, SQLITE_
1dbd0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1dbe0 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63     }.      selec
1dbf0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
1dc00 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
1dc10 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20   0, 0, 0, -1, . 
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc30 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72       pDest, addr
1dc40 45 6e 64 2c 20 61 64 64 72 45 6e 64 2c 20 61 66  End, addrEnd, af
1dc50 66 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  f);..      sqlit
1dc60 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
1dc70 28 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (pDel);.    }.  
1dc80 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1dc90 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
1dca0 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20  rEnd);.    .  } 
1dcb0 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61  /* endif aggrega
1dcc0 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f  te query */..  /
1dcd0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
1dce0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1dcf0 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
1dd00 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c  o sort the resul
1dd10 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64  ts.  ** and send
1dd20 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c   them to the cal
1dd30 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65  lback one by one
1dd40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
1dd50 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e  derBy ){.    gen
1dd60 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
1dd70 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69  arse, p, v, pELi
1dd80 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74  st->nExpr, pDest
1dd90 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
1dda0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1ddb0 55 45 52 59 0a 20 20 2f 2a 20 49 66 20 74 68 69  UERY.  /* If thi
1ddc0 73 20 77 61 73 20 61 20 73 75 62 71 75 65 72 79  s was a subquery
1ddd0 2c 20 77 65 20 68 61 76 65 20 6e 6f 77 20 63 6f  , we have now co
1dde0 6e 76 65 72 74 65 64 20 74 68 65 20 73 75 62 71  nverted the subq
1ddf0 75 65 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a  uery into a.  **
1de00 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1de10 2e 20 20 53 6f 20 73 65 74 20 74 68 65 20 53 72  .  So set the Sr
1de20 63 4c 69 73 74 5f 69 74 65 6d 2e 69 73 50 6f 70  cList_item.isPop
1de30 75 6c 61 74 65 64 20 66 6c 61 67 20 74 6f 20 70  ulated flag to p
1de40 72 65 76 65 6e 74 0a 20 20 2a 2a 20 74 68 69 73  revent.  ** this
1de50 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62   subquery from b
1de60 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61  eing evaluated a
1de70 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63  gain and to forc
1de80 65 20 74 68 65 20 75 73 65 20 6f 66 0a 20 20 2a  e the use of.  *
1de90 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
1dea0 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
1deb0 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ( pParent ){.   
1dec0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1ded0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72  ->pSrc->nSrc>par
1dee0 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73  entTab );.    as
1def0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1df00 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62  Src->a[parentTab
1df10 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a  ].pSelect==p );.
1df20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72      pParent->pSr
1df30 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e  c->a[parentTab].
1df40 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b  isPopulated = 1;
1df50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1df60 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
1df70 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20  kip this query. 
1df80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1df90 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1dfa0 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68   iEnd);..  /* Th
1dfb0 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63  e SELECT was suc
1dfc0 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e  cessfully coded.
1dfd0 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72     Set the retur
1dfe0 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a  n code to 0.  **
1dff0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20   to indicate no 
1e000 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72  errors..  */.  r
1e010 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  c = 0;..  /* Con
1e020 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65  trol jumps to he
1e030 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  re if an error i
1e040 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62  s encountered ab
1e050 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a  ove, or upon.  *
1e060 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64  * successful cod
1e070 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ing of the SELEC
1e080 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65  T..  */.select_e
1e090 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69  nd:..  /* Identi
1e0a0 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  fy column names 
1e0b0 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  if we will be us
1e0c0 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61  ing them in a ca
1e0d0 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
1e0e0 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
1e0f0 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
1e100 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d   is going to som
1e110 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74  e other destinat
1e120 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
1e130 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1e140 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
1e150 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
1e160 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
1e170 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
1e180 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
1e190 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
1e1a0 5f 66 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61  _free(sAggInfo.a
1e1b0 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Col);.  sqlite3_
1e1c0 66 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61 46  free(sAggInfo.aF
1e1d0 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unc);.  return r
1e1e0 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  c;.}..#if define
1e1f0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
1e200 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /*.*************
1e210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e250 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
1e260 69 6e 67 20 63 6f 64 65 20 69 73 20 75 73 65 64  ing code is used
1e270 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
1e280 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
1e290 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68    The code.** th
1e2a0 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20  at follows does 
1e2b0 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f  not appear in no
1e2c0 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a  rmal builds..**.
1e2d0 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
1e2e0 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 70 72  s are used to pr
1e2f0 69 6e 74 20 6f 75 74 20 74 68 65 20 63 6f 6e 74  int out the cont
1e300 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61  ent of all or pa
1e310 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73  rt of a .** pars
1e320 65 20 73 74 72 75 63 74 75 72 65 73 20 73 75 63  e structures suc
1e330 68 20 61 73 20 53 65 6c 65 63 74 20 6f 72 20 45  h as Select or E
1e340 78 70 72 2e 20 20 53 75 63 68 20 70 72 69 6e 74  xpr.  Such print
1e350 6f 75 74 73 20 61 72 65 20 75 73 65 66 75 6c 0a  outs are useful.
1e360 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e 67 20 74  ** for helping t
1e370 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 77 68 61  o understand wha
1e380 74 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 69  t is happening i
1e390 6e 73 69 64 65 20 74 68 65 20 63 6f 64 65 20 67  nside the code g
1e3a0 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69  enerator.** duri
1e3b0 6e 67 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e  ng the execution
1e3c0 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45   of complex SELE
1e3d0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
1e3e0 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
1e3f0 6e 65 20 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65  ne are not calle
1e400 64 20 61 6e 79 77 68 65 72 65 20 66 72 6f 6d 20  d anywhere from 
1e410 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61  within the norma
1e420 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73 65 2e 20  l.** code base. 
1e430 20 54 68 65 6e 20 61 72 65 20 69 6e 74 65 6e 64   Then are intend
1e440 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
1e450 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20  from within the 
1e460 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66  debugger.** or f
1e470 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20 22 70  rom temporary "p
1e480 72 69 6e 74 66 22 20 73 74 61 74 65 6d 65 6e 74  rintf" statement
1e490 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20 64  s inserted for d
1e4a0 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  ebugging..*/.voi
1e4b0 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78  d sqlite3PrintEx
1e4c0 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  pr(Expr *p){.  i
1e4d0 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26  f( p->token.z &&
1e4e0 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30 20 29 7b   p->token.n>0 ){
1e4f0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1e500 67 50 72 69 6e 74 66 28 22 28 25 2e 2a 73 22 2c  gPrintf("(%.*s",
1e510 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e   p->token.n, p->
1e520 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d 65 6c 73  token.z);.  }els
1e530 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e{.    sqlite3De
1e540 62 75 67 50 72 69 6e 74 66 28 22 28 25 64 22 2c  bugPrintf("(%d",
1e550 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20 69   p->op);.  }.  i
1e560 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  f( p->pLeft ){. 
1e570 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1e580 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20  rintf(" ");.    
1e590 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
1e5a0 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a  (p->pLeft);.  }.
1e5b0 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20    if( p->pRight 
1e5c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
1e5d0 62 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a  bugPrintf(" ");.
1e5e0 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
1e5f0 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 29 3b  Expr(p->pRight);
1e600 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
1e610 62 75 67 50 72 69 6e 74 66 28 22 29 22 29 3b 0a  bugPrintf(")");.
1e620 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72  }.void sqlite3Pr
1e630 69 6e 74 45 78 70 72 4c 69 73 74 28 45 78 70 72  intExprList(Expr
1e640 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
1e650 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1e660 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
1e670 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1e680 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 4c 69  te3PrintExpr(pLi
1e690 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
1e6a0 0a 20 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74  .    if( i<pList
1e6b0 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20  ->nExpr-1 ){.   
1e6c0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1e6d0 72 69 6e 74 66 28 22 2c 20 22 29 3b 0a 20 20 20  rintf(", ");.   
1e6e0 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71   }.  }.}.void sq
1e6f0 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74  lite3PrintSelect
1e700 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
1e710 69 6e 64 65 6e 74 29 7b 0a 20 20 73 71 6c 69 74  indent){.  sqlit
1e720 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
1e730 2a 73 53 45 4c 45 43 54 28 25 70 29 20 22 2c 20  *sSELECT(%p) ", 
1e740 69 6e 64 65 6e 74 2c 20 22 22 2c 20 70 29 3b 0a  indent, "", p);.
1e750 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
1e760 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
1e770 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
1e780 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
1e790 20 69 66 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a   if( p->pSrc ){.
1e7a0 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65 66 69      char *zPrefi
1e7b0 78 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  x;.    int i;.  
1e7c0 20 20 7a 50 72 65 66 69 78 20 3d 20 22 46 52 4f    zPrefix = "FRO
1e7d0 4d 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  M";.    for(i=0;
1e7e0 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
1e7f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
1e800 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1e810 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70  m *pItem = &p->p
1e820 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
1e830 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1e840 6e 74 66 28 22 25 2a 73 20 22 2c 20 69 6e 64 65  ntf("%*s ", inde
1e850 6e 74 2b 36 2c 20 7a 50 72 65 66 69 78 29 3b 0a  nt+6, zPrefix);.
1e860 20 20 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20        zPrefix = 
1e870 22 22 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  "";.      if( pI
1e880 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
1e890 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
1e8a0 65 62 75 67 50 72 69 6e 74 66 28 22 28 5c 6e 22  ebugPrintf("(\n"
1e8b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1e8c0 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28 70 49  e3PrintSelect(pI
1e8d0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 6e  tem->pSelect, in
1e8e0 64 65 6e 74 2b 31 30 29 3b 0a 20 20 20 20 20 20  dent+10);.      
1e8f0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1e900 69 6e 74 66 28 22 25 2a 73 29 22 2c 20 69 6e 64  intf("%*s)", ind
1e910 65 6e 74 2b 38 2c 20 22 22 29 3b 0a 20 20 20 20  ent+8, "");.    
1e920 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65    }else if( pIte
1e930 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  m->zName ){.    
1e940 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1e950 50 72 69 6e 74 66 28 22 25 73 22 2c 20 70 49 74  Printf("%s", pIt
1e960 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
1e970 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
1e980 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  tem->pTab ){.   
1e990 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
1e9a0 67 50 72 69 6e 74 66 28 22 28 74 61 62 6c 65 3a  gPrintf("(table:
1e9b0 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54   %s)", pItem->pT
1e9c0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
1e9d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
1e9e0 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
1e9f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
1ea00 62 75 67 50 72 69 6e 74 66 28 22 20 41 53 20 25  bugPrintf(" AS %
1ea10 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  s", pItem->zAlia
1ea20 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
1ea30 20 20 69 66 28 20 69 3c 70 2d 3e 70 53 72 63 2d    if( i<p->pSrc-
1ea40 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20 20 20  >nSrc-1 ){.     
1ea50 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1ea60 72 69 6e 74 66 28 22 2c 22 29 3b 0a 20 20 20 20  rintf(",");.    
1ea70 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1ea80 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
1ea90 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
1eaa0 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b  if( p->pWhere ){
1eab0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1eac0 67 50 72 69 6e 74 66 28 22 25 2a 73 20 57 48 45  gPrintf("%*s WHE
1ead0 52 45 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  RE ", indent, ""
1eae0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
1eaf0 69 6e 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72  intExpr(p->pWher
1eb00 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
1eb10 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
1eb20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
1eb30 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73  GroupBy ){.    s
1eb40 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1eb50 66 28 22 25 2a 73 20 47 52 4f 55 50 20 42 59 20  f("%*s GROUP BY 
1eb60 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
1eb70 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
1eb80 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
1eb90 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  upBy);.    sqlit
1eba0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
1ebb0 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n");.  }.  if( p
1ebc0 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ->pHaving ){.   
1ebd0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1ebe0 6e 74 66 28 22 25 2a 73 20 48 41 56 49 4e 47 20  ntf("%*s HAVING 
1ebf0 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
1ec00 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
1ec10 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 29  Expr(p->pHaving)
1ec20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
1ec30 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
1ec40 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72    }.  if( p->pOr
1ec50 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
1ec60 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1ec70 22 25 2a 73 20 4f 52 44 45 52 20 42 59 20 22 2c  "%*s ORDER BY ",
1ec80 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
1ec90 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
1eca0 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
1ecb0 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
1ecc0 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
1ecd0 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20  );.  }.}./* End 
1ece0 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
1ecf0 20 64 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20   debug printing 
1ed00 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  code.***********
1ed10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ed20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ed30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ed40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ed50 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  **/.#endif /* de
1ed60 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1ed70 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
1ed80 4c 49 54 45 5f 44 45 42 55 47 29 20 2a 2f 0a     LITE_DEBUG) */.