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

Artifact 578f7b01047b20349ead5a36d7e64274a61bea80:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 34 30 32  select.c,v 1.402
0200: 20 32 30 30 38 2f 30 31 2f 31 35 20 30 32 3a 32   2008/01/15 02:2
0210: 32 3a 32 34 20 64 72 68 20 45 78 70 20 24 0a 2a  2:24 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
0250: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
0260: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 62 75  ect structure bu
0270: 74 20 64 6f 20 6e 6f 74 20 64 65 61 6c 6c 6f 63  t do not dealloc
0280: 61 74 65 0a 2a 2a 20 74 68 65 20 73 65 6c 65 63  ate.** the selec
0290: 74 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  t structure itse
02a0: 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  lf..*/.static vo
02b0: 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74 28 53  id clearSelect(S
02c0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c  elect *p){.  sql
02d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
02e0: 74 65 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  te(p->pEList);. 
02f0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
0300: 65 6c 65 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a  elete(p->pSrc);.
0310: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
0320: 65 74 65 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a  ete(p->pWhere);.
0330: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0340: 74 44 65 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75  tDelete(p->pGrou
0350: 70 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  pBy);.  sqlite3E
0360: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 48 61  xprDelete(p->pHa
0370: 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  ving);.  sqlite3
0380: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
0390: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73  ->pOrderBy);.  s
03a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
03b0: 74 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  te(p->pPrior);. 
03c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
03d0: 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  te(p->pLimit);. 
03e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
03f0: 74 65 28 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  te(p->pOffset);.
0400: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
0410: 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73 74  ize a SelectDest
0420: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76   structure..*/.v
0430: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0440: 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74  tDestInit(Select
0450: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74  Dest *pDest, int
0460: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
0470: 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65  m){.  pDest->eDe
0480: 73 74 20 3d 20 65 44 65 73 74 3b 0a 20 20 70 44  st = eDest;.  pD
0490: 65 73 74 2d 3e 69 50 61 72 6d 20 3d 20 69 50 61  est->iParm = iPa
04a0: 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66  rm;.  pDest->aff
04b0: 69 6e 69 74 79 20 3d 20 30 3b 0a 20 20 70 44 65  inity = 0;.  pDe
04c0: 73 74 2d 3e 69 4d 65 6d 20 3d 20 30 3b 0a 7d 0a  st->iMem = 0;.}.
04d0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
04e0: 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74   a new Select st
04f0: 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75  ructure and retu
0500: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
0510: 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72  that.** structur
0520: 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71  e..*/.Select *sq
0530: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a  lite3SelectNew(.
0540: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
0550: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
0560: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
0570: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
0580: 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63  ,     /* which c
0590: 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64  olumns to includ
05a0: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
05b0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
05c0: 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  rc,        /* th
05d0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d  e FROM clause --
05e0: 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f   which tables to
05f0: 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20   scan */.  Expr 
0600: 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
0610: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
0620: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
0630: 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20  st *pGroupBy,   
0640: 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  /* the GROUP BY 
0650: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
0660: 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20   *pHaving,      
0670: 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20    /* the HAVING 
0680: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
0690: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
06a0: 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42    /* the ORDER B
06b0: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
06c0: 74 20 69 73 44 69 73 74 69 6e 63 74 2c 20 20 20  t isDistinct,   
06d0: 20 20 20 20 2f 2a 20 74 72 75 65 20 69 66 20 74      /* true if t
06e0: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
06f0: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
0700: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
0710: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d  ,         /* LIM
0720: 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20  IT value.  NULL 
0730: 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a  means not used *
0740: 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65  /.  Expr *pOffse
0750: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46  t         /* OFF
0760: 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  SET value.  NULL
0770: 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74   means no offset
0780: 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
0790: 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20  *pNew;.  Select 
07a0: 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74  standin;.  sqlit
07b0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
07c0: 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  >db;.  pNew = sq
07d0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
07e0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  o(db, sizeof(*pN
07f0: 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ew) );.  assert(
0800: 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70 4c 69   !pOffset || pLi
0810: 6d 69 74 20 29 3b 20 20 20 2f 2a 20 43 61 6e 27  mit );   /* Can'
0820: 74 20 68 61 76 65 20 4f 46 46 53 45 54 20 77 69  t have OFFSET wi
0830: 74 68 6f 75 74 20 4c 49 4d 49 54 2e 20 2a 2f 0a  thout LIMIT. */.
0840: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
0850: 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61  .    pNew = &sta
0860: 6e 64 69 6e 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ndin;.    memset
0870: 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (pNew, 0, sizeof
0880: 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20 20  (*pNew));.  }.  
0890: 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b  if( pEList==0 ){
08a0: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71  .    pEList = sq
08b0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
08c0: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
08d0: 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 54 4b  qlite3Expr(db,TK
08e0: 5f 41 4c 4c 2c 30 2c 30 2c 30 29 2c 20 30 29 3b  _ALL,0,0,0), 0);
08f0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
0900: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
0910: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72  pNew->pSrc = pSr
0920: 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  c;.  pNew->pWher
0930: 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e  e = pWhere;.  pN
0940: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70  ew->pGroupBy = p
0950: 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d  GroupBy;.  pNew-
0960: 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69  >pHaving = pHavi
0970: 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64  ng;.  pNew->pOrd
0980: 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
0990: 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69 73 74 69  .  pNew->isDisti
09a0: 6e 63 74 20 3d 20 69 73 44 69 73 74 69 6e 63 74  nct = isDistinct
09b0: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54  ;.  pNew->op = T
09c0: 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 61 73 73 65  K_SELECT;.  asse
09d0: 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c  rt( pOffset==0 |
09e0: 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20  | pLimit!=0 );. 
09f0: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
0a00: 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e  pLimit;.  pNew->
0a10: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
0a20: 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69  t;.  pNew->iLimi
0a30: 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  t = -1;.  pNew->
0a40: 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20  iOffset = -1;.  
0a50: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0a60: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
0a70: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0a80: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
0a90: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
0aa0: 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 4e  ] = -1;.  if( pN
0ab0: 65 77 3d 3d 26 73 74 61 6e 64 69 6e 29 20 7b 0a  ew==&standin) {.
0ac0: 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28      clearSelect(
0ad0: 70 4e 65 77 29 3b 0a 20 20 20 20 70 4e 65 77 20  pNew);.    pNew 
0ae0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
0af0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
0b00: 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76 65   Delete the give
0b10: 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  n Select structu
0b20: 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  re and all of it
0b30: 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73 2e  s substructures.
0b40: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0b50: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 53 65 6c  SelectDelete(Sel
0b60: 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ect *p){.  if( p
0b70: 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c   ){.    clearSel
0b80: 65 63 74 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  ect(p);.    sqli
0b90: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
0ba0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
0bb0: 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65  1 to 3 identifie
0bc0: 72 73 20 70 72 65 63 65 65 64 69 6e 67 20 74 68  rs preceeding th
0bd0: 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20  e JOIN keyword, 
0be0: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a  determine the.**
0bf0: 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20   type of join.  
0c00: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
0c10: 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  r constant that 
0c20: 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74  expresses that t
0c30: 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20  ype.** in terms 
0c40: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
0c50: 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a   bit values:.**.
0c60: 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a  **     JT_INNER.
0c70: 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a  **     JT_CROSS.
0c80: 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a  **     JT_OUTER.
0c90: 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41  **     JT_NATURA
0ca0: 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54  L.**     JT_LEFT
0cb0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54  .**     JT_RIGHT
0cc0: 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75  .**.** A full ou
0cd0: 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20  ter join is the 
0ce0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a  combination of J
0cf0: 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49  T_LEFT and JT_RI
0d00: 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  GHT..**.** If an
0d10: 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75   illegal or unsu
0d20: 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70  pported join typ
0d30: 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20  e is seen, then 
0d40: 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20  still return.** 
0d50: 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74  a join type, but
0d60: 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e   put an error in
0d70: 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
0d80: 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cture..*/.int sq
0d90: 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61  lite3JoinType(Pa
0da0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
0db0: 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70  en *pA, Token *p
0dc0: 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20  B, Token *pC){. 
0dd0: 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
0de0: 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c  0;.  Token *apAl
0df0: 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  l[3];.  Token *p
0e00: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0e10: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
0e20: 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 77 6f 72  nst char zKeywor
0e30: 64 5b 38 5d 3b 0a 20 20 20 20 75 38 20 6e 43 68  d[8];.    u8 nCh
0e40: 61 72 3b 0a 20 20 20 20 75 38 20 63 6f 64 65 3b  ar;.    u8 code;
0e50: 0a 20 20 7d 20 6b 65 79 77 6f 72 64 73 5b 5d 20  .  } keywords[] 
0e60: 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 61 74 75 72  = {.    { "natur
0e70: 61 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41 54 55 52  al", 7, JT_NATUR
0e80: 41 4c 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65 66  AL },.    { "lef
0e90: 74 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46  t",    4, JT_LEF
0ea0: 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20  T|JT_OUTER },.  
0eb0: 20 20 7b 20 22 72 69 67 68 74 22 2c 20 20 20 35    { "right",   5
0ec0: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
0ed0: 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75  TER },.    { "fu
0ee0: 6c 6c 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45  ll",    4, JT_LE
0ef0: 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  FT|JT_RIGHT|JT_O
0f00: 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 6f  UTER },.    { "o
0f10: 75 74 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 4f  uter",   5, JT_O
0f20: 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 69  UTER },.    { "i
0f30: 6e 6e 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 49  nner",   5, JT_I
0f40: 4e 4e 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 63  NNER },.    { "c
0f50: 72 6f 73 73 22 2c 20 20 20 35 2c 20 4a 54 5f 49  ross",   5, JT_I
0f60: 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 7d 2c  NNER|JT_CROSS },
0f70: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  .  };.  int i, j
0f80: 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70  ;.  apAll[0] = p
0f90: 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20  A;.  apAll[1] = 
0fa0: 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d  pB;.  apAll[2] =
0fb0: 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   pC;.  for(i=0; 
0fc0: 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b  i<3 && apAll[i];
0fd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61   i++){.    p = a
0fe0: 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  pAll[i];.    for
0ff0: 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b  (j=0; j<sizeof(k
1000: 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28  eywords)/sizeof(
1010: 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b  keywords[0]); j+
1020: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
1030: 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e  >n==keywords[j].
1040: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
1050: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
1060: 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  Cmp((char*)p->z,
1070: 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b 65   keywords[j].zKe
1080: 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30 20  yword, p->n)==0 
1090: 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74  ){.        joint
10a0: 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72 64 73 5b  ype |= keywords[
10b0: 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20  j].code;.       
10c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
10d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e      }.    if( j>
10e0: 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73  =sizeof(keywords
10f0: 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64  )/sizeof(keyword
1100: 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 6a  s[0]) ){.      j
1110: 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52  ointype |= JT_ER
1120: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
1130: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1140: 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  (.     (jointype
1150: 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   & (JT_INNER|JT_
1160: 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e  OUTER))==(JT_INN
1170: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a  ER|JT_OUTER) ||.
1180: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1190: 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20   JT_ERROR)!=0.  
11a0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
11b0: 72 20 2a 7a 53 70 31 20 3d 20 22 20 22 3b 0a 20  r *zSp1 = " ";. 
11c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11d0: 53 70 32 20 3d 20 22 20 22 3b 0a 20 20 20 20 69  Sp2 = " ";.    i
11e0: 66 28 20 70 42 3d 3d 30 20 29 7b 20 7a 53 70 31  f( pB==0 ){ zSp1
11f0: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 43  ++; }.    if( pC
1200: 3d 3d 30 20 29 7b 20 7a 53 70 32 2b 2b 3b 20 7d  ==0 ){ zSp2++; }
1210: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1220: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
1230: 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f  known or unsuppo
1240: 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20  rted join type: 
1250: 22 0a 20 20 20 20 20 20 20 22 25 54 25 73 25 54  ".       "%T%s%T
1260: 25 73 25 54 22 2c 20 70 41 2c 20 7a 53 70 31 2c  %s%T", pA, zSp1,
1270: 20 70 42 2c 20 7a 53 70 32 2c 20 70 43 29 3b 0a   pB, zSp2, pC);.
1280: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
1290: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65  T_INNER;.  }else
12a0: 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20 26 20   if( jointype & 
12b0: 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20 20 20  JT_RIGHT ){.    
12c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12d0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
12e0: 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f  RIGHT and FULL O
12f0: 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e  UTER JOINs are n
1300: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70  ot currently sup
1310: 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f  ported");.    jo
1320: 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45  intype = JT_INNE
1330: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
1340: 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  jointype;.}../*.
1350: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
1360: 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  dex of a column 
1370: 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74  in a table.  Ret
1380: 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f  urn -1 if the co
1390: 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63  lumn.** is not c
13a0: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
13b0: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
13c0: 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   int columnIndex
13d0: 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f  (Table *pTab, co
13e0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b  nst char *zCol){
13f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1400: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
1410: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
1420: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1430: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
1440: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20  ame, zCol)==0 ) 
1450: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
1460: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
1470: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
1480: 65 20 6f 66 20 61 20 74 6f 6b 65 6e 20 74 6f 20  e of a token to 
1490: 61 20 27 5c 30 30 30 27 2d 74 65 72 6d 69 6e 61  a '\000'-termina
14a0: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  ted string..*/.s
14b0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 54 6f  tatic void setTo
14c0: 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f  ken(Token *p, co
14d0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
14e0: 70 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a 3b 0a 20  p->z = (u8*)z;. 
14f0: 20 70 2d 3e 6e 20 3d 20 7a 20 3f 20 73 74 72 6c   p->n = z ? strl
1500: 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 70 2d 3e  en(z) : 0;.  p->
1510: 64 79 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  dyn = 0;.}../*.*
1520: 2a 20 53 65 74 20 74 68 65 20 74 6f 6b 65 6e 20  * Set the token 
1530: 74 6f 20 74 68 65 20 64 6f 75 62 6c 65 2d 71 75  to the double-qu
1540: 6f 74 65 64 20 61 6e 64 20 65 73 63 61 70 65 64  oted and escaped
1550: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
1560: 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 0a 2a  string pointed.*
1570: 2a 20 74 6f 20 62 79 20 7a 2e 20 46 6f 72 20 65  * to by z. For e
1580: 78 61 6d 70 6c 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  xample;.**.**   
1590: 20 7b 61 22 62 63 7d 20 20 2d 3e 20 20 7b 22 61   {a"bc}  ->  {"a
15a0: 22 22 62 63 22 7d 0a 2a 2f 0a 73 74 61 74 69 63  ""bc"}.*/.static
15b0: 20 76 6f 69 64 20 73 65 74 51 75 6f 74 65 64 54   void setQuotedT
15c0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
15d0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f  se, Token *p, co
15e0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
15f0: 70 2d 3e 7a 20 3d 20 28 75 38 20 2a 29 73 71 6c  p->z = (u8 *)sql
1600: 69 74 65 33 4d 50 72 69 6e 74 66 28 30 2c 20 22  ite3MPrintf(0, "
1610: 5c 22 25 77 5c 22 22 2c 20 7a 29 3b 0a 20 20 70  \"%w\"", z);.  p
1620: 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 69 66 28  ->dyn = 1;.  if(
1630: 20 70 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 2d 3e   p->z ){.    p->
1640: 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72  n = strlen((char
1650: 20 2a 29 70 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73   *)p->z);.  }els
1660: 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64  e{.    pParse->d
1670: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1680: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
1690: 2a 20 43 72 65 61 74 65 20 61 6e 20 65 78 70 72  * Create an expr
16a0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20  ession node for 
16b0: 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 77 69  an identifier wi
16c0: 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 7a  th the name of z
16d0: 4e 61 6d 65 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  Name.*/.Expr *sq
16e0: 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70  lite3CreateIdExp
16f0: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1700: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1710: 6d 65 29 7b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d  me){.  Token dum
1720: 6d 79 3b 0a 20 20 73 65 74 54 6f 6b 65 6e 28 26  my;.  setToken(&
1730: 64 75 6d 6d 79 2c 20 7a 4e 61 6d 65 29 3b 0a 20  dummy, zName);. 
1740: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
1750: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
1760: 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79  ID, 0, 0, &dummy
1770: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  );.}.../*.** Add
1780: 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 57   a term to the W
1790: 48 45 52 45 20 65 78 70 72 65 73 73 69 6f 6e 20  HERE expression 
17a0: 69 6e 20 2a 70 70 45 78 70 72 20 74 68 61 74 20  in *ppExpr that 
17b0: 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a 2a 20  requires the.** 
17c0: 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74 6f 20 62  zCol column to b
17d0: 65 20 65 71 75 61 6c 20 69 6e 20 74 68 65 20 74  e equal in the t
17e0: 77 6f 20 74 61 62 6c 65 73 20 70 54 61 62 31 20  wo tables pTab1 
17f0: 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f 0a 73 74  and pTab2..*/.st
1800: 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65  atic void addWhe
1810: 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20  reTerm(.  Parse 
1820: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1830: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1840: 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ntext */.  const
1850: 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20   char *zCol,    
1860: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1870: 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  he column */.  c
1880: 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62  onst Table *pTab
1890: 31 2c 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  1,      /* First
18a0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73   table */.  cons
18b0: 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73 31 2c  t char *zAlias1,
18c0: 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f       /* Alias fo
18d0: 72 20 66 69 72 73 74 20 74 61 62 6c 65 2e 20 20  r first table.  
18e0: 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
18f0: 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54   const Table *pT
1900: 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53 65 63  ab2,      /* Sec
1910: 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63  ond table */.  c
1920: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61  onst char *zAlia
1930: 73 32 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73  s2,     /* Alias
1940: 20 66 6f 72 20 73 65 63 6f 6e 64 20 74 61 62 6c   for second tabl
1950: 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
1960: 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 4a  */.  int iRightJ
1970: 6f 69 6e 54 61 62 6c 65 2c 20 20 20 20 20 2f 2a  oinTable,     /*
1980: 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
1990: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
19a0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
19b0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
19c0: 2a 20 41 64 64 20 74 68 65 20 65 71 75 61 6c 69  * Add the equali
19d0: 74 79 20 74 65 72 6d 20 74 6f 20 74 68 69 73 20  ty term to this 
19e0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
19f0: 0a 20 20 45 78 70 72 20 2a 70 45 31 61 2c 20 2a  .  Expr *pE1a, *
1a00: 70 45 31 62 2c 20 2a 70 45 31 63 3b 0a 20 20 45  pE1b, *pE1c;.  E
1a10: 78 70 72 20 2a 70 45 32 61 2c 20 2a 70 45 32 62  xpr *pE2a, *pE2b
1a20: 2c 20 2a 70 45 32 63 3b 0a 20 20 45 78 70 72 20  , *pE2c;.  Expr 
1a30: 2a 70 45 3b 0a 0a 20 20 70 45 31 61 20 3d 20 73  *pE;..  pE1a = s
1a40: 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78  qlite3CreateIdEx
1a50: 70 72 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 29  pr(pParse, zCol)
1a60: 3b 0a 20 20 70 45 32 61 20 3d 20 73 71 6c 69 74  ;.  pE2a = sqlit
1a70: 65 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70  e3CreateIdExpr(p
1a80: 50 61 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20  Parse, zCol);.  
1a90: 69 66 28 20 7a 41 6c 69 61 73 31 3d 3d 30 20 29  if( zAlias1==0 )
1aa0: 7b 0a 20 20 20 20 7a 41 6c 69 61 73 31 20 3d 20  {.    zAlias1 = 
1ab0: 70 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pTab1->zName;.  
1ac0: 7d 0a 20 20 70 45 31 62 20 3d 20 73 71 6c 69 74  }.  pE1b = sqlit
1ad0: 65 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70  e3CreateIdExpr(p
1ae0: 50 61 72 73 65 2c 20 7a 41 6c 69 61 73 31 29 3b  Parse, zAlias1);
1af0: 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 32 3d 3d  .  if( zAlias2==
1b00: 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 32  0 ){.    zAlias2
1b10: 20 3d 20 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b   = pTab2->zName;
1b20: 0a 20 20 7d 0a 20 20 70 45 32 62 20 3d 20 73 71  .  }.  pE2b = sq
1b30: 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70  lite3CreateIdExp
1b40: 72 28 70 50 61 72 73 65 2c 20 7a 41 6c 69 61 73  r(pParse, zAlias
1b50: 32 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c  2);.  pE1c = sql
1b60: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
1b70: 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 31 62 2c 20  , TK_DOT, pE1b, 
1b80: 70 45 31 61 2c 20 30 29 3b 0a 20 20 70 45 32 63  pE1a, 0);.  pE2c
1b90: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
1ba0: 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
1bb0: 70 45 32 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a  pE2b, pE2a, 0);.
1bc0: 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33 50 45    pE = sqlite3PE
1bd0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 45  xpr(pParse, TK_E
1be0: 51 2c 20 70 45 31 63 2c 20 70 45 32 63 2c 20 30  Q, pE1c, pE2c, 0
1bf0: 29 3b 0a 20 20 69 66 28 20 70 45 20 29 7b 0a 20  );.  if( pE ){. 
1c00: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
1c10: 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f  ty(pE, EP_FromJo
1c20: 69 6e 29 3b 0a 20 20 20 20 70 45 2d 3e 69 52 69  in);.    pE->iRi
1c30: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 69  ghtJoinTable = i
1c40: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
1c50: 20 20 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d 20    }.  *ppExpr = 
1c60: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
1c70: 50 61 72 73 65 2d 3e 64 62 2c 2a 70 70 45 78 70  Parse->db,*ppExp
1c80: 72 2c 20 70 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r, pE);.}../*.**
1c90: 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f 6d   Set the EP_From
1ca0: 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e  Join property on
1cb0: 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
1cc0: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
1cd0: 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74  on..** And set t
1ce0: 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  he Expr.iRightJo
1cf0: 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62 6c  inTable to iTabl
1d00: 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d  e for every term
1d10: 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   in the.** expre
1d20: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ssion..**.** The
1d30: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f   EP_FromJoin pro
1d40: 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e  perty is used on
1d50: 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70   terms of an exp
1d60: 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a  ression to tell.
1d70: 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45  ** the LEFT OUTE
1d80: 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e  R JOIN processin
1d90: 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69  g logic that thi
1da0: 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f  s term is part o
1db0: 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65  f the.** join re
1dc0: 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66  striction specif
1dd0: 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ied in the ON or
1de0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e   USING clause an
1df0: 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20  d not a part.** 
1e00: 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65  of the more gene
1e10: 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  ral WHERE clause
1e20: 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61  .  These terms a
1e30: 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f  re moved over to
1e40: 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
1e50: 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e  ause during join
1e60: 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20   processing but 
1e70: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  we need to remem
1e80: 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a  ber that they.**
1e90: 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74   originated in t
1ea0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
1eb0: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lause..**.** The
1ec0: 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e   Expr.iRightJoin
1ed0: 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65 20  Table tells the 
1ee0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
1ef0: 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68 65  cessing that the
1f00: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64  .** expression d
1f10: 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20  epends on table 
1f20: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1f30: 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61 62  even if that tab
1f40: 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70  le is not.** exp
1f50: 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65  licitly mentione
1f60: 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73  d in the express
1f70: 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f 72  ion.  That infor
1f80: 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65 64  mation is needed
1f90: 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c 69  .** for cases li
1fa0: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1fb0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1fc0: 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
1fd0: 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44  ON t1.a=t2.b AND
1fe0: 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68   t1.x=5.**.** Th
1ff0: 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6e  e where clause n
2000: 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74 68  eeds to defer th
2010: 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68  e handling of th
2020: 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d  e t1.x=5.** term
2030: 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65   until after the
2040: 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20   t2 loop of the 
2050: 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20 77  join.  In that w
2060: 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32  ay, a.** NULL t2
2070: 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e 73   row will be ins
2080: 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  erted whenever t
2090: 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20 64  1.x!=5.  If we d
20a0: 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74  o not.** defer t
20b0: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
20c0: 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62  1.x=5, it will b
20d0: 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d 65  e processed imme
20e0: 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72  diately.** after
20f0: 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64   the t1 loop and
2100: 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78 21   rows with t1.x!
2110: 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 70  =5 will never ap
2120: 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f  pear in.** the o
2130: 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73 20  utput, which is 
2140: 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74  incorrect..*/.st
2150: 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69  atic void setJoi
2160: 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69  nExpr(Expr *p, i
2170: 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68  nt iTable){.  wh
2180: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78  ile( p ){.    Ex
2190: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c  prSetProperty(p,
21a0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
21b0: 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e     p->iRightJoin
21c0: 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a  Table = iTable;.
21d0: 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
21e0: 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  p->pLeft, iTable
21f0: 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52  );.    p = p->pR
2200: 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a  ight;.  } .}../*
2210: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2220: 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 6a   processes the j
2230: 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oin information 
2240: 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61  for a SELECT sta
2250: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e  tement..** ON an
2260: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
2270: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  are converted in
2280: 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  to extra terms o
2290: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
22a0: 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a  se..** NATURAL j
22b0: 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74 65  oins also create
22c0: 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61   extra WHERE cla
22d0: 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a  use terms..**.**
22e0: 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20   The terms of a 
22f0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65 20  FROM clause are 
2300: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
2310: 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74 72   Select.pSrc str
2320: 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c  ucture..** The l
2330: 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20 69  eft most table i
2340: 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  s the first entr
2350: 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72 63  y in Select.pSrc
2360: 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
2370: 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74 68  t.** table is th
2380: 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20 54  e last entry.  T
2390: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
23a0: 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20   is held in the 
23b0: 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20  entry to.** the 
23c0: 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74 72  left.  Thus entr
23d0: 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  y 0 contains the
23e0: 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 66   join operator f
23f0: 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74 77  or the join betw
2400: 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30  een.** entries 0
2410: 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20   and 1.  Any ON 
2420: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
2430: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2440: 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a   the join are.**
2450: 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20 74   also attached t
2460: 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72 79  o the left entry
2470: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2480: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
2490: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
24a0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  s encountered..*
24b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
24c0: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50  iteProcessJoin(P
24d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
24e0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c  lect *p){.  SrcL
24f0: 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
2500: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2510: 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
2520: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
2530: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2560: 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  rs */.  struct S
2570: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65  rcList_item *pLe
2580: 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74 20  ft;     /* Left 
2590: 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e  table being join
25a0: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ed */.  struct S
25b0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52 69  rcList_item *pRi
25c0: 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 74  ght;    /* Right
25d0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
25e0: 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d  ned */..  pSrc =
25f0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66   p->pSrc;.  pLef
2600: 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b  t = &pSrc->a[0];
2610: 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c 65  .  pRight = &pLe
2620: 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ft[1];.  for(i=0
2630: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ; i<pSrc->nSrc-1
2640: 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c  ; i++, pRight++,
2650: 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54   pLeft++){.    T
2660: 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20 3d  able *pLeftTab =
2670: 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20 20   pLeft->pTab;.  
2680: 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54    Table *pRightT
2690: 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61  ab = pRight->pTa
26a0: 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 65 66  b;..    if( pLef
26b0: 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68  tTab==0 || pRigh
26c0: 74 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  tTab==0 ) contin
26d0: 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  ue;..    /* When
26e0: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
26f0: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c  word is present,
2700: 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73   add WHERE claus
2710: 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20  e terms for.    
2720: 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ** every column 
2730: 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62  that the two tab
2740: 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d  les have in comm
2750: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
2760: 66 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74  f( pRight->joint
2770: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
2780: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
2790: 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69  ight->pOn || pRi
27a0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
27b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
27c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
27d0: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d  a NATURAL join m
27e0: 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20  ay not have ".  
27f0: 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20           "an ON 
2800: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22  or USING clause"
2810: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
2820: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
2830: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2840: 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43 6f 6c 3b  <pLeftTab->nCol;
2850: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
2860: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 65  har *zName = pLe
2870: 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  ftTab->aCol[j].z
2880: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
2890: 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52  ( columnIndex(pR
28a0: 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3e  ightTab, zName)>
28b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
28c0: 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61  addWhereTerm(pPa
28d0: 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c 65 66  rse, zName, pLef
28e0: 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c  tTab, pLeft->zAl
28f0: 69 61 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ias, .          
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 20 20 20 70 52 69 67 68 74 54 61 62 2c 20 70      pRightTab, p
2920: 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20  Right->zAlias,. 
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
2950: 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20 26 70  ght->iCursor, &p
2960: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
2970: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a       .        }.
2980: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2990: 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62     /* Disallow b
29a0: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
29b0: 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20   clauses in the 
29c0: 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f  same join.    */
29d0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
29e0: 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e  >pOn && pRight->
29f0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
2a00: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2a10: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
2a20: 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64  have both ON and
2a30: 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20   USING ".       
2a40: 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65   "clauses in the
2a50: 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20   same join");.  
2a60: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2a70: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
2a80: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f  the ON clause to
2a90: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2aa0: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f  WHERE clause, co
2ab0: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a  nnected by.    *
2ac0: 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  * an AND operato
2ad0: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
2ae0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b  ( pRight->pOn ){
2af0: 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78  .      setJoinEx
2b00: 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20  pr(pRight->pOn, 
2b10: 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29  pRight->iCursor)
2b20: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72  ;.      p->pWher
2b30: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
2b40: 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
2b50: 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68 74  ->pWhere, pRight
2b60: 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52  ->pOn);.      pR
2b70: 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20  ight->pOn = 0;. 
2b80: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
2b90: 61 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20  ate extra terms 
2ba0: 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  on the WHERE cla
2bb0: 75 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  use for each col
2bc0: 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a  umn named.    **
2bd0: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
2be0: 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20  ause.  Example: 
2bf0: 49 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  If the two table
2c00: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61  s to be joined a
2c10: 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64  re .    ** A and
2c20: 20 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47   B and the USING
2c30: 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c   clause names X,
2c40: 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20   Y, and Z, then 
2c50: 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  add this.    ** 
2c60: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
2c70: 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20  use:    A.X=B.X 
2c80: 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20  AND A.Y=B.Y AND 
2c90: 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52  A.Z=B.Z.    ** R
2ca0: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69  eport an error i
2cb0: 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e  f any column men
2cc0: 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53  tioned in the US
2cd0: 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20  ING clause is.  
2ce0: 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e    ** not contain
2cf0: 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  ed in both table
2d00: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a  s to be joined..
2d10: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2d20: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
2d30: 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70  .      IdList *p
2d40: 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70  List = pRight->p
2d50: 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72  Using;.      for
2d60: 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e  (j=0; j<pList->n
2d70: 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; j++){.      
2d80: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
2d90: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  pList->a[j].zNam
2da0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  e;.        if( c
2db0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74  olumnIndex(pLeft
2dc0: 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c  Tab, zName)<0 ||
2dd0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69   columnIndex(pRi
2de0: 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30  ghtTab, zName)<0
2df0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2e00: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2e10: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f  arse, "cannot jo
2e20: 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20  in using column 
2e30: 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20  %s - column ".  
2e40: 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70            "not p
2e50: 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74  resent in both t
2e60: 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ables", zName);.
2e70: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2e80: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2e90: 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65        addWhereTe
2ea0: 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  rm(pParse, zName
2eb0: 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66  , pLeftTab, pLef
2ec0: 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20  t->zAlias, .    
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 54 61          pRightTa
2ef0: 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61  b, pRight->zAlia
2f00: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2f20: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20  Right->iCursor, 
2f30: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
2f40: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2f50: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2f60: 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20  .** Insert code 
2f70: 69 6e 74 6f 20 22 76 22 20 74 68 61 74 20 77 69  into "v" that wi
2f80: 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65 63 6f  ll push the reco
2f90: 72 64 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  rd on the top of
2fa0: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e   the.** stack in
2fb0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
2fc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  /.static void pu
2fd0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
2fe0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2ff0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
3000: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
3010: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
3020: 2c 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  ,    /* The ORDE
3030: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
3040: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
3050: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77  ,       /* The w
3060: 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74  hole SELECT stat
3070: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ement */.  int r
3080: 65 67 44 61 74 61 20 20 20 20 20 20 20 20 20 20  egData          
3090: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
30a0: 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65  lding data to be
30b0: 20 73 6f 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20   sorted */.){.  
30c0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
30d0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6e  ->pVdbe;.  int n
30e0: 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
30f0: 3e 6e 45 78 70 72 3b 0a 20 20 69 6e 74 20 72 65  >nExpr;.  int re
3100: 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47  gBase = sqlite3G
3110: 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
3120: 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20  se, nExpr+2);.  
3130: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
3140: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
3150: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
3160: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
3170: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72  List(pParse, pOr
3180: 64 65 72 42 79 2c 20 72 65 67 42 61 73 65 29 3b  derBy, regBase);
3190: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
31a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp2(v, OP_Seque
31b0: 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  nce, pOrderBy->i
31c0: 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65  ECursor, regBase
31d0: 2b 6e 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74  +nExpr);.  sqlit
31e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
31f0: 4f 50 5f 4d 6f 76 65 2c 20 72 65 67 44 61 74 61  OP_Move, regData
3200: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b  , regBase+nExpr+
3210: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
3220: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65  eAddOp3(v, OP_Re
3230: 67 4d 61 6b 65 52 65 63 2c 20 72 65 67 42 61 73  gMakeRec, regBas
3240: 65 2c 20 6e 45 78 70 72 20 2b 20 32 2c 20 72 65  e, nExpr + 2, re
3250: 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
3260: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3270: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
3280: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
3290: 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  r, regRecord);. 
32a0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
32b0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
32c0: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
32d0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
32e0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
32f0: 42 61 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a  Base, nExpr+2);.
3300: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69    if( pSelect->i
3310: 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20  Limit>=0 ){.    
3320: 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
3330: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74  ;.    int iLimit
3340: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ;.    if( pSelec
3350: 74 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  t->pOffset ){.  
3360: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65      iLimit = pSe
3370: 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b  lect->iOffset+1;
3380: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3390: 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65    iLimit = pSele
33a0: 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  ct->iLimit;.    
33b0: 7d 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  }.    addr1 = sq
33c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
33d0: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c  v, OP_IfZero, iL
33e0: 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  imit);.    sqlit
33f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3400: 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69  OP_AddImm, iLimi
3410: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  t, -1);.    addr
3420: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
3430: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
3440: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3450: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
3460: 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr1);.    sqlite
3470: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
3480: 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79  P_Last, pOrderBy
3490: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
34a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34b0: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
34c0: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
34d0: 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  sor);.    sqlite
34e0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
34f0: 20 61 64 64 72 32 29 3b 0a 20 20 20 20 70 53 65   addr2);.    pSe
3500: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d  lect->iLimit = -
3510: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
3520: 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c  Add code to impl
3530: 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54  ement the OFFSET
3540: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3550: 63 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64  codeOffset(.  Vd
3560: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
3570: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
3580: 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f   into this VM */
3590: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
35a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
35b0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
35c0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
35d0: 74 20 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20  t iContinue     
35e0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
35f0: 73 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e 74  skip the current
3600: 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
3610: 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 3e 3d  if( p->iOffset>=
3620: 30 20 26 26 20 69 43 6f 6e 74 69 6e 75 65 21 3d  0 && iContinue!=
3630: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  0 ){.    int add
3640: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  r;.    sqlite3Vd
3650: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
3660: 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66 73 65  ddImm, p->iOffse
3670: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  t, -1);.    addr
3680: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
3690: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 65 67  dOp1(v, OP_IfNeg
36a0: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20  , p->iOffset);. 
36b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
36d0: 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   0, iContinue);.
36e0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
36f0: 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45 54  (v, "skip OFFSET
3700: 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 20   records"));.   
3710: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
3720: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
3730: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
3740: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
3750: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
3760: 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72  e the N register
3770: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d  s starting at iM
3780: 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73  em.** form a dis
3790: 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54  tinct entry.  iT
37a0: 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20  ab is a sorting 
37b0: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
37c0: 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73   previously.** s
37d0: 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  een combinations
37e0: 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73   of the N values
37f0: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
3800: 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a  s made in iTab.*
3810: 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  * if the current
3820: 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65   N values are ne
3830: 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  w..**.** A jump 
3840: 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73  to addrRepeat is
3850: 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b   made and the N+
3860: 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70  1 values are pop
3870: 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ped from the.** 
3880: 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70  stack if the top
3890: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20   N elements are 
38a0: 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f  not distinct..*/
38b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
38c0: 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72  eDistinct(.  Par
38d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
38e0: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
38f0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
3900: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
3910: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
3920: 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  * A sorting inde
3930: 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66  x used to test f
3940: 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20  or distinctness 
3950: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70  */.  int addrRep
3960: 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eat,    /* Jump 
3970: 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64  to here if not d
3980: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
3990: 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
39a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
39b0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
39c0: 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem           /*
39d0: 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a   First element *
39e0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  /.){.  Vdbe *v;.
39f0: 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d    int r1;..  v =
3a00: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
3a10: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
3a20: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
3a30: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3a40: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 67 4d  ddOp3(v, OP_RegM
3a50: 61 6b 65 52 65 63 2c 20 69 4d 65 6d 2c 20 4e 2c  akeRec, iMem, N,
3a60: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   r1);.  sqlite3V
3a70: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
3a80: 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64  Found, iTab, add
3a90: 72 52 65 70 65 61 74 2c 20 72 31 29 3b 0a 20 20  rRepeat, r1);.  
3aa0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3ab0: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
3ac0: 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20  t, iTab, r1);.  
3ad0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
3ae0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
3af0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
3b00: 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rate an error me
3b10: 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c  ssage when a SEL
3b20: 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74 68  ECT is used with
3b30: 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73 69  in a subexpressi
3b40: 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20  on.** (example: 
3b50: 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a   "a IN (SELECT *
3b60: 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62   FROM table)") b
3b70: 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74  ut it has more t
3b80: 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20  han 1 result.** 
3b90: 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74  column.  We do t
3ba0: 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74  his in a subrout
3bb0: 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65 20  ine because the 
3bc0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
3bd0: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 70 6c 61 63  multiple.** plac
3be0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
3bf0: 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  t checkForMultiC
3c00: 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
3c10: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3c20: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
3c30: 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20  e context. */.  
3c40: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
3c50: 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74  t,   /* Destinat
3c60: 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65  ion of SELECT re
3c70: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  sults */.  int n
3c80: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
3c90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
3ca0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75  ult columns retu
3cb0: 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a  rned by SELECT *
3cc0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74  /.){.  int eDest
3cd0: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
3ce0: 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26  .  if( nExpr>1 &
3cf0: 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  & (eDest==SRT_Me
3d00: 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  m || eDest==SRT_
3d10: 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Set) ){.    sqli
3d20: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3d30: 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67  se, "only a sing
3d40: 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65  le result allowe
3d50: 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22  d for ".       "
3d60: 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73  a SELECT that is
3d70: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
3d80: 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65  ession");.    re
3d90: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
3da0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
3db0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
3dc0: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
3dd0: 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
3de0: 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68  the inside of th
3df0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
3e00: 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  of a SELECT..**.
3e10: 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e 64  ** If srcTab and
3e20: 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74   nColumn are bot
3e30: 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  h zero, then the
3e40: 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69   pEList expressi
3e50: 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75  ons.** are evalu
3e60: 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
3e70: 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f   get the data fo
3e80: 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20  r this row.  If 
3e90: 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65  nColumn>0.** the
3ea0: 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64  n data is pulled
3eb0: 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64   from srcTab and
3ec0: 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20   pEList is used 
3ed0: 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a  only to get the.
3ee0: 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f 72  ** datatypes for
3ef0: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
3f00: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
3f10: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50  ctInnerLoop(.  P
3f20: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3f30: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
3f40: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
3f50: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
3f60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3f70: 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74   complete select
3f80: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
3f90: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72   coded */.  Expr
3fa0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
3fb0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76      /* List of v
3fc0: 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74 72  alues being extr
3fd0: 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  acted */.  int s
3fe0: 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  rcTab,          
3ff0: 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20     /* Pull data 
4000: 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20  from this table 
4010: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
4020: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
4030: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
4040: 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20  s in the source 
4050: 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
4060: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
4070: 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c     /* If not NUL
4080: 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20  L, sort results 
4090: 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a  using this key *
40a0: 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74  /.  int distinct
40b0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
40c0: 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65  f >=0, make sure
40d0: 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73   results are dis
40e0: 74 69 6e 63 74 20 2a 2f 0a 20 20 53 65 6c 65 63  tinct */.  Selec
40f0: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
4100: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73     /* How to dis
4110: 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75  pose of the resu
4120: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  lts */.  int iCo
4130: 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20  ntinue,         
4140: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
4150: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
4160: 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ext row */.  int
4170: 20 69 42 72 65 61 6b 2c 20 20 20 20 20 20 20 20   iBreak,        
4180: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
4190: 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
41a0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
41b0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20   */.  char *aff 
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
41d0: 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
41e0: 20 69 66 20 65 44 65 73 74 20 69 73 20 53 52 54   if eDest is SRT
41f0: 5f 55 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56  _Union */.){.  V
4200: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
4210: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c  >pVdbe;.  int i,
4220: 20 6e 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73   n;.  int hasDis
4230: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
4240: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
4250: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
4260: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
4270: 74 20 69 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  t iMem;         
4280: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
4290: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
42a0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
42b0: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
42c0: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74  st->eDest;.  int
42d0: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
42e0: 69 50 61 72 6d 3b 0a 0a 20 20 69 66 28 20 76 3d  iParm;..  if( v=
42f0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4300: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
4310: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  =0 );..  /* If t
4320: 68 65 72 65 20 77 61 73 20 61 20 4c 49 4d 49 54  here was a LIMIT
4330: 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 53   clause on the S
4340: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
4350: 20 74 68 65 6e 20 64 6f 20 74 68 65 20 63 68 65   then do the che
4360: 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69  ck.  ** to see i
4370: 66 20 74 68 69 73 20 72 6f 77 20 73 68 6f 75 6c  f this row shoul
4380: 64 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  d be output..  *
4390: 2f 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20  /.  hasDistinct 
43a0: 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30 20 26 26  = distinct>=0 &&
43b0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30   pEList->nExpr>0
43c0: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
43d0: 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69  ==0 && !hasDisti
43e0: 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f  nct ){.    codeO
43f0: 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e  ffset(v, p, iCon
4400: 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  tinue);.  }..  /
4410: 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65  * Pull the reque
4420: 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20  sted columns..  
4430: 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e  */.  if( nColumn
4440: 3e 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 43  >0 ){.    n = nC
4450: 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  olumn;.  }else{.
4460: 20 20 20 20 6e 20 3d 20 70 45 4c 69 73 74 2d 3e      n = pEList->
4470: 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28  nExpr;.  }.  if(
4480: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3e 30 20 29   pDest->iMem>0 )
4490: 7b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 70 44 65  {.    iMem = pDe
44a0: 73 74 2d 3e 69 4d 65 6d 3b 0a 20 20 7d 65 6c 73  st->iMem;.  }els
44b0: 65 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 4d  e{.    pDest->iM
44c0: 65 6d 20 3d 20 69 4d 65 6d 20 3d 20 70 50 61 72  em = iMem = pPar
44d0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
44e0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
44f0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 43 6f  n;.  }.  if( nCo
4500: 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f  lumn>0 ){.    fo
4510: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e  r(i=0; i<nColumn
4520: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
4530: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4540: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
4550: 63 54 61 62 2c 20 69 2c 20 69 4d 65 6d 2b 69 29  cTab, i, iMem+i)
4560: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
4570: 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45  if( eDest!=SRT_E
4580: 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20  xists ){.    /* 
4590: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
45a0: 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53 28  on is an EXISTS(
45b0: 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c  ...) expression,
45c0: 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20   the actual.    
45d0: 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e  ** values return
45e0: 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
45f0: 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65   are not require
4600: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
4610: 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
4620: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
4630: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
4640: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
4650: 70 72 2c 20 69 4d 65 6d 2b 69 29 3b 0a 20 20 20  pr, iMem+i);.   
4660: 20 7d 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e   }.  }.  nColumn
4670: 20 3d 20 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   = n;..  /* If t
4680: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
4690: 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20  ord was present 
46a0: 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  on the SELECT st
46b0: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64  atement.  ** and
46c0: 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65   this row has be
46d0: 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20  en seen before, 
46e0: 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65  then do not make
46f0: 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70   this row.  ** p
4700: 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c  art of the resul
4710: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61  t..  */.  if( ha
4720: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
4730: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
4740: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
4750: 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  ( pEList->nExpr=
4760: 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20  =nColumn );.    
4770: 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
4780: 72 73 65 2c 20 64 69 73 74 69 6e 63 74 2c 20 69  rse, distinct, i
4790: 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d  Continue, nColum
47a0: 6e 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 69 66  n, iMem);.    if
47b0: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ( pOrderBy==0 ){
47c0: 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65  .      codeOffse
47d0: 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
47e0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
47f0: 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c   if( checkForMul
4800: 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
4810: 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73  ror(pParse, pDes
4820: 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
4830: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
4840: 30 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  0;.  }..  switch
4850: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f  ( eDest ){.    /
4860: 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20  * In this mode, 
4870: 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79  write each query
4880: 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b   result to the k
4890: 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  ey of the tempor
48a0: 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ary.    ** table
48b0: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23   iParm..    */.#
48c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
48d0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
48e0: 43 54 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  CT.    case SRT_
48f0: 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73  Union: {.      s
4900: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4910: 28 76 2c 20 4f 50 5f 52 65 67 4d 61 6b 65 52 65  (v, OP_RegMakeRe
4920: 63 2c 20 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e  c, iMem, nColumn
4930: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 66 66  );.      if( aff
4940: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4950: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
4960: 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 34 5f 53  v, -1, aff, P4_S
4970: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a  TATIC);.      }.
4980: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4990: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
49a0: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
49b0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
49c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
49d0: 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72  onstruct a recor
49e0: 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79  d from the query
49f0: 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73   result, but ins
4a00: 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73  tead of.    ** s
4a10: 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72  aving that recor
4a20: 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b  d, use it as a k
4a30: 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65  ey to delete ele
4a40: 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a  ments from.    *
4a50: 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
4a60: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
4a70: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
4a80: 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20  _Except: {.     
4a90: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
4aa0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
4ab0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4ac0: 52 65 67 4d 61 6b 65 52 65 63 2c 20 69 4d 65 6d  RegMakeRec, iMem
4ad0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
4ae0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
4af0: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 61 66 66  ngeP4(v, -1, aff
4b00: 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
4b10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4b20: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 46  ddOp2(v, OP_NotF
4b30: 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20 61 64 64  ound, iParm, add
4b40: 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
4b50: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4b60: 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50 61 72   OP_Delete, iPar
4b70: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  m, 0);.      bre
4b80: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
4b90: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
4ba0: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
4bb0: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
4bc0: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
4bd0: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
4be0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
4bf0: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
4c00: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
4c10: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
4c20: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
4c30: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4c40: 50 5f 52 65 67 4d 61 6b 65 52 65 63 2c 20 69 4d  P_RegMakeRec, iM
4c50: 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29  em, nColumn, r1)
4c60: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
4c70: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
4c80: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
4c90: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
4ca0: 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d   p, r1);.      }
4cb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
4cc0: 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65  t r2 = sqlite3Ge
4cd0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
4ce0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4cf0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4d00: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
4d10: 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  m, r2);.        
4d20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4d30: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
4d40: 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  iParm, r1, r2);.
4d50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4d60: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
4d70: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
4d80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
4d90: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
4da0: 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
4db0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  }.      sqlite3R
4dc0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
4dd0: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
4de0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
4df0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4e00: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
4e10: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
4e20: 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
4e30: 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
4e40: 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72  ECT ...)" constr
4e50: 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  uct,.    ** then
4e60: 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   there should be
4e70: 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f   a single item o
4e80: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72  n the stack.  Wr
4e90: 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ite this.    ** 
4ea0: 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65  item into the se
4eb0: 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67  t table with bog
4ec0: 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  us data..    */.
4ed0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
4ee0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
4ef0: 64 72 32 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  dr2;..      asse
4f00: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
4f10: 3b 0a 20 20 20 20 20 20 61 64 64 72 32 20 3d 20  ;.      addr2 = 
4f20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4f30: 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
4f40: 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iMem, 0);.      
4f50: 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  p->affinity = sq
4f60: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
4f70: 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30  nity(pEList->a[0
4f80: 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e  ].pExpr, pDest->
4f90: 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20  affinity);.     
4fa0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
4fb0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66  .        /* At f
4fc0: 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20  irst glance you 
4fd0: 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63  would think we c
4fe0: 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75  ould optimize ou
4ff0: 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  t the.        **
5000: 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68 69   ORDER BY in thi
5010: 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68 65  s case since the
5020: 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65   order of entrie
5030: 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20  s in the set.   
5040: 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74       ** does not
5050: 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74 68   matter.  But th
5060: 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c  ere might be a L
5070: 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20  IMIT clause, in 
5080: 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a  which.        **
5090: 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72 20   case the order 
50a0: 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20  does matter */. 
50b0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
50c0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
50d0: 72 64 65 72 42 79 2c 20 70 2c 20 69 4d 65 6d 29  rderBy, p, iMem)
50e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
50f0: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
5100: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
5110: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
5120: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5130: 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 67 4d 61  dOp4(v, OP_RegMa
5140: 6b 65 52 65 63 2c 20 69 4d 65 6d 2c 20 31 2c 20  keRec, iMem, 1, 
5150: 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79  r1, &p->affinity
5160: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
5170: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5180: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
5190: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
51a0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
51b0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
51c0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r1);.      }.
51d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
51e0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
51f0: 72 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r2);.      break
5200: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5210: 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74  If any row exist
5220: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
5230: 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20  et, record that 
5240: 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a  fact and abort..
5250: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
5260: 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20  SRT_Exists: {.  
5270: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5280: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
5290: 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a  ger, 1, iParm);.
52a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
52b0: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
52c0: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
52d0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
52e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
52f0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
5300: 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
5310: 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
5320: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
5330: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
5340: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
5350: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
5360: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
5370: 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
5380: 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
5390: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
53a0: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
53b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
53c0: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
53d0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
53e0: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
53f0: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
5400: 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 69 4d   pOrderBy, p, iM
5410: 65 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  em);.      }else
5420: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5430: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5440: 50 5f 4d 6f 76 65 2c 20 69 4d 65 6d 2c 20 69 50  P_Move, iMem, iP
5450: 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  arm);.        /*
5460: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
5470: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
5480: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
5490: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
54a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
54b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
54c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
54d0: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
54e0: 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74 61  /* Send the data
54f0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
5500: 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20   function or to 
5510: 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49  a subroutine.  I
5520: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73  n the.    ** cas
5530: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
5540: 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  e, the subroutin
5550: 65 20 69 74 73 65 6c 66 20 69 73 20 72 65 73 70  e itself is resp
5560: 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20  onsible for.    
5570: 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64  ** popping the d
5580: 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ata from the sta
5590: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ck..    */.    c
55a0: 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69  ase SRT_Subrouti
55b0: 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ne:.    case SRT
55c0: 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 20  _Callback: {.   
55d0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
55e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
55f0: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
5600: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
5610: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5620: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52  beAddOp3(v, OP_R
5630: 65 67 4d 61 6b 65 52 65 63 2c 20 69 4d 65 6d 2c  egMakeRec, iMem,
5640: 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20   nColumn, r1);. 
5650: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
5660: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
5670: 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a  rderBy, p, r1);.
5680: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
5690: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
56a0: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
56b0: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
56c0: 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65  ==SRT_Subroutine
56d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
56e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
56f0: 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50   OP_Gosub, 0, iP
5700: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  arm);.      }els
5710: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
5720: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5730: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 69 4d  OP_ResultRow, iM
5740: 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  em, nColumn);.  
5750: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
5760: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64  k;.    }..#if !d
5770: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5780: 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  IT_TRIGGER).    
5790: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
57a0: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
57b0: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
57c0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
57d0: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
57e0: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
57f0: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
5800: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
5810: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
5820: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
5830: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
5840: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
5850: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
5860: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
5870: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
5880: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
5890: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
58a0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
58b0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
58c0: 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72  card );.      br
58d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
58e0: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  f.  }..  /* Jump
58f0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
5900: 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
5910: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
5920: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
5930: 4c 69 6d 69 74 3e 3d 30 20 26 26 20 70 4f 72 64  Limit>=0 && pOrd
5940: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73  erBy==0 ){.    s
5950: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5960: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70  (v, OP_AddImm, p
5970: 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20  ->iLimit, -1);. 
5980: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5990: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp2(v, OP_IfZer
59a0: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
59b0: 72 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74  reak);.  }.  ret
59c0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
59d0: 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73  Given an express
59e0: 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61  ion list, genera
59f0: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  te a KeyInfo str
5a00: 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f  ucture that reco
5a10: 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61  rds.** the colla
5a20: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
5a30: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
5a40: 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  n in that expres
5a50: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
5a60: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
5a70: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
5a80: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
5a90: 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  se then the resu
5aa0: 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f  lting.** KeyInfo
5ab0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
5ac0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
5ad0: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
5ae0: 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a  tual index to.**
5af0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20   implement that 
5b00: 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20  clause.  If the 
5b10: 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20  ExprList is the 
5b20: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
5b30: 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74  SELECT.** then t
5b40: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
5b50: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
5b60: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
5b70: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a  zing a virtual.*
5b80: 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65  * index to imple
5b90: 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20  ment a DISTINCT 
5ba0: 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  test..**.** Spac
5bb0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65  e to hold the Ke
5bc0: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
5bd0: 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20 6d  is obtain from m
5be0: 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c  alloc.  The call
5bf0: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
5c00: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
5c10: 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74  or seeing that t
5c20: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
5c30: 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
5c40: 72 65 65 64 2e 20 20 41 64 64 20 74 68 65 20 4b  reed.  Add the K
5c50: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
5c60: 20 74 6f 20 74 68 65 20 50 34 20 66 69 65 6c 64   to the P4 field
5c70: 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75 73   of an opcode us
5c80: 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49 4e 46  ing.** P4_KEYINF
5c90: 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68 65  O_HANDOFF is the
5ca0: 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64 65   usual way of de
5cb0: 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73 2e  aling with this.
5cc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e  .*/.static KeyIn
5cd0: 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  fo *keyInfoFromE
5ce0: 78 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a 70  xprList(Parse *p
5cf0: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
5d00: 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69 74  *pList){.  sqlit
5d10: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5d20: 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72  >db;.  int nExpr
5d30: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e  ;.  KeyInfo *pIn
5d40: 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  fo;.  struct Exp
5d50: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
5d60: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e  m;.  int i;..  n
5d70: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  Expr = pList->nE
5d80: 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73  xpr;.  pInfo = s
5d90: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
5da0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
5db0: 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28 73  Info) + nExpr*(s
5dc0: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
5dd0: 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66  1) );.  if( pInf
5de0: 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  o ){.    pInfo->
5df0: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
5e00: 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  *)&pInfo->aColl[
5e10: 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e 66  nExpr];.    pInf
5e20: 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78 70  o->nField = nExp
5e30: 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65 6e  r;.    pInfo->en
5e40: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
5e50: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
5e60: 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70  pList->a; i<nExp
5e70: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
5e80: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
5e90: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
5ea0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
5eb0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
5ec0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
5ed0: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
5ee0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
5ef0: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
5f00: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
5f10: 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d   pInfo->aColl[i]
5f20: 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
5f30: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
5f40: 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  r[i] = pItem->so
5f50: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
5f60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
5f70: 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  o;.}.../*.** If 
5f80: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
5f90: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
5fa0: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
5fb0: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
5fc0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
5fd0: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
5fe0: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
5ff0: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
6000: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
6010: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
6020: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
6030: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
6040: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
6050: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
6060: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
6070: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
6080: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6090: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
60a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
60b0: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
60c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
60d0: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
60e0: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
60f0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62  atement */.  Vdb
6100: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
6110: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
6120: 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  into this VDBE *
6130: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
6140: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6150: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  of columns of da
6160: 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ta */.  SelectDe
6170: 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69  st *pDest /* Wri
6180: 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65  te the sorted re
6190: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
61a0: 0a 20 20 69 6e 74 20 62 72 6b 20 3d 20 73 71 6c  .  int brk = sql
61b0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
61c0: 6c 28 76 29 3b 0a 20 20 69 6e 74 20 63 6f 6e 74  l(v);.  int cont
61d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
61e0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e  keLabel(v);.  in
61f0: 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69 54  t addr;.  int iT
6200: 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64 6f  ab;.  int pseudo
6210: 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c  Tab = 0;.  ExprL
6220: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
6230: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20  p->pOrderBy;..  
6240: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
6250: 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20  t->eDest;.  int 
6260: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
6270: 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20 72 65 67  Parm;..  int reg
6280: 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f  Row;.  int regRo
6290: 77 69 64 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70  wid;..  iTab = p
62a0: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
62b0: 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  r;.  if( eDest==
62c0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c 20  SRT_Callback || 
62d0: 65 44 65 73 74 3d 3d 53 52 54 5f 53 75 62 72 6f  eDest==SRT_Subro
62e0: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73 65  utine ){.    pse
62f0: 75 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65 2d  udoTab = pParse-
6300: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nTab++;.    sql
6310: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6320: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
6330: 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a   pseudoTab, 0);.
6340: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6350: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e  ddOp2(v, OP_SetN
6360: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70 73 65 75 64  umColumns, pseud
6370: 6f 54 61 62 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  oTab, nColumn);.
6380: 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 31 20 2b    }.  addr = 1 +
6390: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
63a0: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69  p2(v, OP_Sort, i
63b0: 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 63 6f 64  Tab, brk);.  cod
63c0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 63 6f  eOffset(v, p, co
63d0: 6e 74 29 3b 0a 20 20 72 65 67 52 6f 77 20 3d 20  nt);.  regRow = 
63e0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
63f0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67  g(pParse);.  reg
6400: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47  Rowid = sqlite3G
6410: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
6420: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6430: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
6440: 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65  umn, iTab, pOrde
6450: 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20  rBy->nExpr + 1, 
6460: 72 65 67 52 6f 77 29 3b 0a 20 20 73 77 69 74 63  regRow);.  switc
6470: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
6480: 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a  case SRT_Table:.
6490: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
64a0: 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73  emTab: {.      s
64b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
64c0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
64d0: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64   iParm, regRowid
64e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
64f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6500: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
6510: 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64  regRow, regRowid
6520: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6530: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6540: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
6550: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6560: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
6570: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
6580: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
6590: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 31  : {.      int j1
65a0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
65b0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
65c0: 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
65d0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
65e0: 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 29  _IsNull, regRow)
65f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6600: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
6610: 52 65 67 4d 61 6b 65 52 65 63 2c 20 72 65 67 52  RegMakeRec, regR
6620: 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 2c 20 26  ow, 1, regRow, &
6630: 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  p->affinity, 1);
6640: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6650: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6660: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
6670: 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 20 20   regRow);.      
6680: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
6690: 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
66a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
66b0: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
66c0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
66d0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
66e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
66f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 6f 76  AddOp2(v, OP_Mov
6700: 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d  e, regRow, iParm
6710: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
6720: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
6730: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
6740: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
6750: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6760: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
6770: 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a  e SRT_Callback:.
6780: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 75 62      case SRT_Sub
6790: 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20  routine: {.     
67a0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71   int i;.      sq
67b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
67c0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
67d0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
67e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
67f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
6800: 74 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 72 65  t, pseudoTab, re
6810: 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b  gRow, regRowid);
6820: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
6830: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
6840: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6850: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6860: 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64 6f 54  _Column, pseudoT
6870: 61 62 2c 20 69 2c 20 70 44 65 73 74 2d 3e 69 4d  ab, i, pDest->iM
6880: 65 6d 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  em+i);.      }. 
6890: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
68a0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
68b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
68c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
68d0: 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73 74  ResultRow, pDest
68e0: 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29  ->iMem, nColumn)
68f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6900: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6910: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
6920: 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b  osub, 0, iParm);
6930: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6940: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6950: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
6960: 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
6970: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
6980: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
6990: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
69a0: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29  (pParse, regRow)
69b0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
69c0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
69d0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20  , regRowid);..  
69e0: 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
69f0: 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77  nd of the loop w
6a00: 68 65 6e 20 74 68 65 20 4c 49 4d 49 54 20 69 73  hen the LIMIT is
6a10: 20 72 65 61 63 68 65 64 0a 20 20 2a 2f 0a 20 20   reached.  */.  
6a20: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30  if( p->iLimit>=0
6a30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
6a40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6a50: 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69 6d 69  AddImm, p->iLimi
6a60: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  t, -1);.    sqli
6a70: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6a80: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69   OP_IfZero, p->i
6a90: 4c 69 6d 69 74 2c 20 62 72 6b 29 3b 0a 20 20 7d  Limit, brk);.  }
6aa0: 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f  ..  /* The botto
6ab0: 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  m of the loop.  
6ac0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
6ad0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
6ae0: 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  cont);.  sqlite3
6af0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6b00: 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
6b10: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
6b20: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
6b30: 20 62 72 6b 29 3b 0a 20 20 69 66 28 20 65 44 65   brk);.  if( eDe
6b40: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
6b50: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53   || eDest==SRT_S
6b60: 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  ubroutine ){.   
6b70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6b80: 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
6b90: 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20  pseudoTab, 0);. 
6ba0: 20 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   }..}../*.** Ret
6bb0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
6bc0: 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69   a string contai
6bd0: 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72  ning the 'declar
6be0: 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74  ation type' of t
6bf0: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
6c00: 20 70 45 78 70 72 2e 20 54 68 65 20 73 74 72 69   pExpr. The stri
6c10: 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61 74 65  ng may be treate
6c20: 64 20 61 73 20 73 74 61 74 69 63 20 62 79 20 74  d as static by t
6c30: 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
6c40: 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   The declaration
6c50: 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61   type is the exa
6c60: 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69  ct datatype defi
6c70: 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64  nition extracted
6c80: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69   from the.** ori
6c90: 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42  ginal CREATE TAB
6ca0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20  LE statement if 
6cb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
6cc0: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a  s a column. The.
6cd0: 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  ** declaration t
6ce0: 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20  ype for a ROWID 
6cf0: 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52  field is INTEGER
6d00: 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61  . Exactly when a
6d10: 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  n expression.** 
6d20: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
6d30: 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f  column can be co
6d40: 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65  mplex in the pre
6d50: 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72  sence of subquer
6d60: 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75  ies. The.** resu
6d70: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
6d80: 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  n in all of the 
6d90: 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54  following SELECT
6da0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a   statements is .
6db0: 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  ** considered a 
6dc0: 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66  column by this f
6dd0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
6de0: 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d   SELECT col FROM
6df0: 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43   tbl;.**   SELEC
6e00: 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52  T (SELECT col FR
6e10: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
6e20: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
6e30: 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20  FROM tbl);.**   
6e40: 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20  SELECT abc FROM 
6e50: 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61  (SELECT col AS a
6e60: 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a  bc FROM tbl);.**
6e70: 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61   .** The declara
6e80: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e  tion type for an
6e90: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68  y expression oth
6ea0: 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e  er than a column
6eb0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61   is NULL..*/.sta
6ec0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
6ed0: 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20 4e 61  columnType(.  Na
6ee0: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
6ef0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a  .  Expr *pExpr,.
6f00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
6f10: 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63 6f 6e  zOriginDb,.  con
6f20: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
6f30: 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63  inTab,.  const c
6f40: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 43 6f  har **pzOriginCo
6f50: 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73  l.){.  char cons
6f60: 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  t *zType = 0;.  
6f70: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
6f80: 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63 68 61  ginDb = 0;.  cha
6f90: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e  r const *zOrigin
6fa0: 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Tab = 0;.  char 
6fb0: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 43 6f  const *zOriginCo
6fc0: 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a  l = 0;.  int j;.
6fd0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c    if( pExpr==0 |
6fe0: 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d  | pNC->pSrcList=
6ff0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
7000: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
7010: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
7020: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
7030: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
7040: 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  N: {.      /* Th
7050: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
7060: 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65  a column. Locate
7070: 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63   the table the c
7080: 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20  olumn is being. 
7090: 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65       ** extracte
70a0: 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f  d from in NameCo
70b0: 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20  ntext.pSrcList. 
70c0: 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62  This table may b
70d0: 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20  e real.      ** 
70e0: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f  database table o
70f0: 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20  r a subquery..  
7100: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62      */.      Tab
7110: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20  le *pTab = 0;   
7120: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
7130: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75  e structure colu
7140: 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20  mn is extracted 
7150: 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65  from */.      Se
7160: 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20  lect *pS = 0;   
7170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c            /* Sel
7180: 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ect the column i
7190: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
71a0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43   */.      int iC
71b0: 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
71c0: 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f  umn;  /* Index o
71d0: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62  f column in pTab
71e0: 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
71f0: 20 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b   pNC && !pTab ){
7200: 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74  .        SrcList
7210: 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43   *pTabList = pNC
7220: 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20  ->pSrcList;.    
7230: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54      for(j=0;j<pT
7240: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20  abList->nSrc && 
7250: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
7260: 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69  Cursor!=pExpr->i
7270: 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20  Table;j++);.    
7280: 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69      if( j<pTabLi
7290: 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20  st->nSrc ){.    
72a0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
72b0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
72c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d  ;.          pS =
72d0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
72e0: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
72f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7300: 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65    pNC = pNC->pNe
7310: 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  xt;.        }.  
7320: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
7330: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
7340: 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 0a 20      /* FIX ME:. 
7350: 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63         ** This c
7360: 61 6e 20 6f 63 63 75 72 73 20 69 66 20 79 6f 75  an occurs if you
7370: 20 68 61 76 65 20 73 6f 6d 65 74 68 69 6e 67 20   have something 
7380: 6c 69 6b 65 20 22 53 45 4c 45 43 54 20 6e 65 77  like "SELECT new
7390: 2e 78 3b 22 20 69 6e 73 69 64 65 0a 20 20 20 20  .x;" inside.    
73a0: 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72      ** a trigger
73b0: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
73c0: 73 2c 20 69 66 20 79 6f 75 20 72 65 66 65 72 65  s, if you refere
73d0: 6e 63 65 20 74 68 65 20 73 70 65 63 69 61 6c 20  nce the special 
73e0: 22 6e 65 77 22 0a 20 20 20 20 20 20 20 20 2a 2a  "new".        **
73f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 72 65   table in the re
7400: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 73 65  sult set of a se
7410: 6c 65 63 74 2e 20 20 57 65 20 64 6f 20 6e 6f 74  lect.  We do not
7420: 20 68 61 76 65 20 61 20 67 6f 6f 64 20 77 61 79   have a good way
7430: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 66  .        ** to f
7440: 69 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 74  ind the actual t
7450: 61 62 6c 65 20 74 79 70 65 2c 20 73 6f 20 63 61  able type, so ca
7460: 6c 6c 20 69 74 20 22 54 45 58 54 22 2e 20 20 54  ll it "TEXT".  T
7470: 68 69 73 20 69 73 20 72 65 61 6c 6c 79 0a 20 20  his is really.  
7480: 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68 69        ** somethi
7490: 6e 67 20 6f 66 20 61 20 62 75 67 2c 20 62 75 74  ng of a bug, but
74a0: 20 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68   I do not know h
74b0: 6f 77 20 74 6f 20 66 69 78 20 69 74 2e 0a 20 20  ow to fix it..  
74c0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
74d0: 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 6f   ** This code do
74e0: 65 73 20 6e 6f 74 20 70 72 6f 64 75 63 65 20 74  es not produce t
74f0: 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
7500: 72 20 2d 20 69 74 20 6a 75 73 74 20 70 72 65 76  r - it just prev
7510: 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ents.        ** 
7520: 61 20 73 65 67 66 61 75 6c 74 2e 20 20 53 65 65  a segfault.  See
7530: 20 74 69 63 6b 65 74 20 23 31 32 32 39 2e 0a 20   ticket #1229.. 
7540: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
7550: 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54 22    zType = "TEXT"
7560: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
7570: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7580: 61 73 73 65 72 74 28 20 70 54 61 62 20 29 3b 0a  assert( pTab );.
7590: 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a        if( pS ){.
75a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22          /* The "
75b0: 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c  table" is actual
75c0: 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ly a sub-select 
75d0: 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68 65  or a view in the
75e0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20   FROM clause.   
75f0: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53       ** of the S
7600: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
7610: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
7620: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
7630: 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20   origin.        
7640: 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  ** data for the 
7650: 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d  result-set colum
7660: 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  n of the sub-sel
7670: 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ect..        */.
7680: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
7690: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e  >=0 && iCol<pS->
76a0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
76b0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
76c0: 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68   iCol is less th
76d0: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
76e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71  e expression req
76f0: 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20 20  uests the.      
7700: 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20      ** rowid of 
7710: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  the sub-select o
7720: 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78 70  r view. This exp
7730: 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c  ression is legal
7740: 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20 20   (see .         
7750: 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69   ** test case mi
7760: 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c  sc2.2.2) - it al
7770: 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20 74  ways evaluates t
7780: 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20  o NULL..        
7790: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e    */.          N
77a0: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
77b0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
77c0: 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  p = pS->pEList->
77d0: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20  a[iCol].pExpr;. 
77e0: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72           sNC.pSr
77f0: 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63  cList = pS->pSrc
7800: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
7810: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20  pNext = 0;.     
7820: 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20       sNC.pParse 
7830: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
7840: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
7850: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
7860: 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c  , p, &zOriginDb,
7870: 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a   &zOriginTab, &z
7880: 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20  OriginCol); .   
7890: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
78a0: 73 65 20 69 66 28 20 70 54 61 62 2d 3e 70 53 63  se if( pTab->pSc
78b0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20  hema ){.        
78c0: 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20  /* A real table 
78d0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
78e0: 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20  t( !pS );.      
78f0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
7900: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
7910: 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  y;.        asser
7920: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
7930: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
7940: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
7950: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
7960: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
7970: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
7980: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
7990: 67 69 6e 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22  ginCol = "rowid"
79a0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
79b0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
79c0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
79d0: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20  ol].zType;.     
79e0: 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20       zOriginCol 
79f0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
7a00: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
7a10: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69    }.        zOri
7a20: 67 69 6e 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a  ginTab = pTab->z
7a30: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
7a40: 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b  ( pNC->pParse ){
7a50: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
7a60: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
7a70: 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70  maToIndex(pNC->p
7a80: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
7a90: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
7aa0: 20 20 20 20 20 7a 4f 72 69 67 69 6e 44 62 20 3d       zOriginDb =
7ab0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62   pNC->pParse->db
7ac0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
7ad0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7ae0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7af0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
7b00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
7b10: 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
7b20: 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
7b30: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
7b40: 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  n is a sub-selec
7b50: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
7b60: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
7b70: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67  nd.      ** orig
7b80: 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20  in info for the 
7b90: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e  single column in
7ba0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
7bb0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  of the SELECT.  
7bc0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
7bd0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
7be0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
7bf0: 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  ;.      Select *
7c00: 70 53 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c  pS = pExpr->pSel
7c10: 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ect;.      Expr 
7c20: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
7c30: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
7c40: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
7c50: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
7c60: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
7c70: 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61  C;.      sNC.pPa
7c80: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
7c90: 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  e;.      zType =
7ca0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
7cb0: 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c  , p, &zOriginDb,
7cc0: 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a   &zOriginTab, &z
7cd0: 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20  OriginCol); .   
7ce0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7cf0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20  #endif.  }.  .  
7d00: 69 66 28 20 70 7a 4f 72 69 67 69 6e 44 62 20 29  if( pzOriginDb )
7d10: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 7a  {.    assert( pz
7d20: 4f 72 69 67 69 6e 54 61 62 20 26 26 20 70 7a 4f  OriginTab && pzO
7d30: 72 69 67 69 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  riginCol );.    
7d40: 2a 70 7a 4f 72 69 67 69 6e 44 62 20 3d 20 7a 4f  *pzOriginDb = zO
7d50: 72 69 67 69 6e 44 62 3b 0a 20 20 20 20 2a 70 7a  riginDb;.    *pz
7d60: 4f 72 69 67 69 6e 54 61 62 20 3d 20 7a 4f 72 69  OriginTab = zOri
7d70: 67 69 6e 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f  ginTab;.    *pzO
7d80: 72 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67  riginCol = zOrig
7d90: 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74  inCol;.  }.  ret
7da0: 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a  urn zType;.}../*
7db0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
7dc0: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
7dd0: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64 65   the VDBE the de
7de0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20  claration types 
7df0: 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  of columns.** in
7e00: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
7e10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7e20: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
7e30: 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pes(.  Parse *pP
7e40: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
7e50: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
7e60: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
7e70: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
7e80: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
7e90: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
7ea0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
7eb0: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
7ec0: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20  ult set */.){.  
7ed0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
7ee0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
7ef0: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
7f00: 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  sNC;.  sNC.pSrcL
7f10: 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
7f20: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
7f30: 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30  Parse;.  for(i=0
7f40: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
7f50: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
7f60: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
7f70: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
7f80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
7f90: 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  Db = 0;.    cons
7fa0: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62  t char *zOrigTab
7fb0: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
7fc0: 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d  char *zOrigCol =
7fd0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
7fe0: 61 72 20 2a 7a 54 79 70 65 20 3d 20 63 6f 6c 75  ar *zType = colu
7ff0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
8000: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
8010: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b  Tab, &zOrigCol);
8020: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62  ..    /* The vdb
8030: 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20  e must make its 
8040: 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20  own copy of the 
8050: 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20  column-type and 
8060: 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f  other .    ** co
8070: 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74  lumn specific st
8080: 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74  rings, in case t
8090: 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73  he schema is res
80a0: 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20  et before this. 
80b0: 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61     ** virtual ma
80c0: 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64  chine is deleted
80d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
80e0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
80f0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
8100: 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65  _DECLTYPE, zType
8110: 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b  , P4_TRANSIENT);
8120: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8130: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
8140: 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53   COLNAME_DATABAS
8150: 45 2c 20 7a 4f 72 69 67 44 62 2c 20 50 34 5f 54  E, zOrigDb, P4_T
8160: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
8170: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8180: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8190: 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54  ME_TABLE, zOrigT
81a0: 61 62 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54  ab, P4_TRANSIENT
81b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
81c0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
81d0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d  i, COLNAME_COLUM
81e0: 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 50 34 5f  N, zOrigCol, P4_
81f0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a  TRANSIENT);.  }.
8200: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
8210: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
8220: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
8230: 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75  he names of colu
8240: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
8250: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20  sult set.  This 
8260: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
8270: 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  sed to provide t
8280: 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61  he.** azCol[] va
8290: 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c  lues in the call
82a0: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
82b0: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
82c0: 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  umnNames(.  Pars
82d0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
82e0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
82f0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
8300: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
8310: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
8320: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
8330: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
8340: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
8350: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
8360: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
8370: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
8380: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
8390: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
83a0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c  ->db;.  int full
83b0: 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65  Names, shortName
83c0: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
83d0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
83e0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
83f0: 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
8400: 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
8410: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
8420: 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
8430: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
8440: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
8450: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
8460: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d  olNamesSet || v=
8470: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
8480: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
8490: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
84a0: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
84b0: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
84c0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
84d0: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
84e0: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
84f0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
8500: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
8510: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
8520: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
8530: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
8540: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
8550: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
8560: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
8570: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
8580: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
8590: 69 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69  if( p==0 ) conti
85a0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c  nue;.    if( pEL
85b0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
85c0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
85d0: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
85e0: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
85f0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8600: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8610: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
8620: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29  , strlen(zName))
8630: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
8640: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8650: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
8660: 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a   && pTabList ){.
8670: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
8680: 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  b;.      char *z
8690: 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Col;.      int i
86a0: 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e  Col = p->iColumn
86b0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
86c0: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
86d0: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
86e0: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e  [j].iCursor!=p->
86f0: 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20  iTable; j++){}. 
8700: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70       assert( j<p
8710: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
8720: 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54  .      pTab = pT
8730: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
8740: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  b;.      if( iCo
8750: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
8760: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
8770: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
8780: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
8790: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
87a0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
87b0: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
87c0: 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  zCol = "rowid";.
87d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
87e0: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62       zCol = pTab
87f0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
8800: 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  me;.      }.    
8810: 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65    if( !shortName
8820: 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20  s && !fullNames 
8830: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  && p->span.z && 
8840: 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a  p->span.z[0] ){.
8850: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8860: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8870: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
8880: 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e  , (char*)p->span
8890: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  .z, p->span.n);.
88a0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
88b0: 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21 73  fullNames || (!s
88c0: 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 70 54 61  hortNames && pTa
88d0: 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29  bList->nSrc>1) )
88e0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
88f0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
8900: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20     char *zTab;. 
8910: 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20  .        zTab = 
8920: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  pTabList->a[j].z
8930: 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69  Alias;.        i
8940: 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20  f( fullNames || 
8950: 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d  zTab==0 ) zTab =
8960: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
8970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
8980: 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a  String(&zName, z
8990: 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20  Tab, ".", zCol, 
89a0: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
89b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
89c0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
89d0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61  OLNAME_NAME, zNa
89e0: 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  me, P4_DYNAMIC);
89f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8a00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8a10: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8a20: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
8a30: 7a 43 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43 6f  zCol, strlen(zCo
8a40: 6c 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l));.      }.   
8a50: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70   }else if( p->sp
8a60: 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e  an.z && p->span.
8a70: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71  z[0] ){.      sq
8a80: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8a90: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8aa0: 45 5f 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29 70  E_NAME, (char*)p
8ab0: 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61  ->span.z, p->spa
8ac0: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73  n.n);.      /* s
8ad0: 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 70 72 65  qlite3VdbeCompre
8ae0: 73 73 53 70 61 63 65 28 76 2c 20 61 64 64 72 29  ssSpace(v, addr)
8af0: 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ; */.    }else{.
8b00: 20 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65        char zName
8b10: 5b 33 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  [30];.      asse
8b20: 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  rt( p->op!=TK_CO
8b30: 4c 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74  LUMN || pTabList
8b40: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
8b50: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
8b60: 7a 65 6f 66 28 7a 4e 61 6d 65 29 2c 20 7a 4e 61  zeof(zName), zNa
8b70: 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20  me, "column%d", 
8b80: 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  i+1);.      sqli
8b90: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8ba0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8bb0: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  NAME, zName, 0);
8bc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e  .    }.  }.  gen
8bd0: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
8be0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
8bf0: 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23  t, pEList);.}..#
8c00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8c10: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
8c20: 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66  CT./*.** Name of
8c30: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
8c40: 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66  operator, used f
8c50: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
8c60: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
8c70: 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f  st char *selectO
8c80: 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20  pName(int id){. 
8c90: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74   char *z;.  swit
8ca0: 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61  ch( id ){.    ca
8cb0: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20  se TK_ALL:      
8cc0: 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22   z = "UNION ALL"
8cd0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
8ce0: 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
8cf0: 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54  : z = "INTERSECT
8d00: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
8d10: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
8d20: 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b     z = "EXCEPT";
8d30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8d40: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
8d50: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b      z = "UNION";
8d60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8d70: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
8d80: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8d90: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
8da0: 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
8db0: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
8dc0: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
8dd0: 74 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74  t prepSelectStmt
8de0: 28 50 61 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a  (Parse*, Select*
8df0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  );../*.** Given 
8e00: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
8e10: 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54  nt, generate a T
8e20: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
8e30: 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a  hat describes.**
8e40: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
8e50: 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a  of that SELECT..
8e60: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
8e70: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
8e80: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
8e90: 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65  , char *zTabName
8ea0: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
8eb0: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  t){.  Table *pTa
8ec0: 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  b;.  int i, j;. 
8ed0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
8ee0: 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  t;.  Column *aCo
8ef0: 6c 2c 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  l, *pCol;.  sqli
8f00: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
8f10: 2d 3e 64 62 3b 0a 0a 20 20 77 68 69 6c 65 28 20  ->db;..  while( 
8f20: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
8f30: 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ) pSelect = pSel
8f40: 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69  ect->pPrior;.  i
8f50: 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d  f( prepSelectStm
8f60: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
8f70: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
8f80: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
8f90: 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c  lite3SelectResol
8fa0: 76 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ve(pParse, pSele
8fb0: 63 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65  ct, 0) ){.    re
8fc0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
8fd0: 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
8fe0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
8ff0: 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
9000: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
9010: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
9020: 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20  .  pTab->nRef = 
9030: 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  1;.  pTab->zName
9040: 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71   = zTabName ? sq
9050: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
9060: 2c 20 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b  , zTabName) : 0;
9070: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
9080: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  ect->pEList;.  p
9090: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69  Tab->nCol = pELi
90a0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73  st->nExpr;.  ass
90b0: 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e  ert( pTab->nCol>
90c0: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f  0 );.  pTab->aCo
90d0: 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74  l = aCol = sqlit
90e0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
90f0: 62 2c 20 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e  b, sizeof(pTab->
9100: 61 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e  aCol[0])*pTab->n
9110: 43 6f 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  Col);.  for(i=0,
9120: 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54   pCol=aCol; i<pT
9130: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ab->nCol; i++, p
9140: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  Col++){.    Expr
9150: 20 2a 70 2c 20 2a 70 52 3b 0a 20 20 20 20 63 68   *p, *pR;.    ch
9160: 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63  ar *zType;.    c
9170: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
9180: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 43  int nName;.    C
9190: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
91a0: 20 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20     int cnt;.    
91b0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
91c0: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 47 65 74  .    .    /* Get
91d0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
91e0: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c  name for the col
91f0: 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  umn.    */.    p
9200: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
9210: 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
9220: 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  t( p->pRight==0 
9230: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f  || p->pRight->to
9240: 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70  ken.z==0 || p->p
9250: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  Right->token.z[0
9260: 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  ]!=0 );.    if( 
9270: 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  (zName = pEList-
9280: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20  >a[i].zName)!=0 
9290: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
92a0: 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  he column contai
92b0: 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e  ns an "AS <name>
92c0: 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e  " phrase, use <n
92d0: 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65  ame> as the name
92e0: 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   */.      zName 
92f0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
9300: 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  p(db, zName);.  
9310: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f    }else if( p->o
9320: 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20 20 20  p==TK_DOT .     
9330: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 52 3d           && (pR=
9340: 70 2d 3e 70 52 69 67 68 74 29 21 3d 30 20 26 26  p->pRight)!=0 &&
9350: 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20   pR->token.z && 
9360: 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 29  pR->token.z[0] )
9370: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63  {.      /* For c
9380: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 66 72  olumns of the fr
9390: 6f 6d 20 41 2e 42 20 75 73 65 20 42 20 61 73 20  om A.B use B as 
93a0: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
93b0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
93c0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 54  3MPrintf(db, "%T
93d0: 22 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b 0a  ", &pR->token);.
93e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
93f0: 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70  >span.z && p->sp
9400: 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  an.z[0] ){.     
9410: 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67   /* Use the orig
9420: 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65  inal text of the
9430: 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69   column expressi
9440: 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a  on as its name *
9450: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
9460: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
9470: 62 2c 20 22 25 54 22 2c 20 26 70 2d 3e 73 70 61  b, "%T", &p->spa
9480: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
9490: 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 65       /* If all e
94a0: 6c 73 65 20 66 61 69 6c 73 2c 20 6d 61 6b 65 20  lse fails, make 
94b0: 75 70 20 61 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  up a name */.   
94c0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
94d0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63  e3MPrintf(db, "c
94e0: 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a  olumn%d", i+1);.
94f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a      }.    if( !z
9500: 4e 61 6d 65 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  Name || db->mall
9510: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
9520: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
9530: 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71  ed = 1;.      sq
9540: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65  lite3_free(zName
9550: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9560: 44 65 6c 65 74 65 54 61 62 6c 65 28 70 54 61 62  DeleteTable(pTab
9570: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
9580: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  0;.    }.    sql
9590: 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d  ite3Dequote(zNam
95a0: 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  e);..    /* Make
95b0: 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e   sure the column
95c0: 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e   name is unique.
95d0: 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73    If the name is
95e0: 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20   not unique,.   
95f0: 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74   ** append a int
9600: 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65  eger to the name
9610: 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f   so that it beco
9620: 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20  mes unique..    
9630: 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73  */.    nName = s
9640: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
9650: 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a    for(j=cnt=0; j
9660: 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <i; j++){.      
9670: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
9680: 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  mp(aCol[j].zName
9690: 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  , zName)==0 ){. 
96a0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61         zName[nNa
96b0: 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  me] = 0;.       
96c0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
96d0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 3a  MPrintf(db, "%z:
96e0: 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e  %d", zName, ++cn
96f0: 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  t);.        j = 
9700: 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -1;.        if( 
9710: 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b  zName==0 ) break
9720: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9730: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20      pCol->zName 
9740: 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a  = zName;..    /*
9750: 20 47 65 74 20 74 68 65 20 74 79 70 65 6e 61 6d   Get the typenam
9760: 65 2c 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  e, type affinity
9770: 2c 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  , and collating 
9780: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
9790: 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  .    ** column..
97a0: 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65      */.    memse
97b0: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
97c0: 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43  f(sNC));.    sNC
97d0: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c  .pSrcList = pSel
97e0: 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 7a  ect->pSrc;.    z
97f0: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Type = sqlite3Db
9800: 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75 6d  StrDup(db, colum
9810: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
9820: 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 70 43  , 0, 0));.    pC
9830: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a 54 79 70  ol->zType = zTyp
9840: 65 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66  e;.    pCol->aff
9850: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
9860: 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a  xprAffinity(p);.
9870: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
9880: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
9890: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
98a0: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
98b0: 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20    pCol->zColl = 
98c0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
98d0: 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  db, pColl->zName
98e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
98f0: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
9900: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
9910: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
9920: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
9930: 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ent for processi
9940: 6e 67 20 62 79 20 64 6f 69 6e 67 20 74 68 65 20  ng by doing the 
9950: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 69  following.** thi
9960: 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ngs:.**.**    (1
9970: 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42  )  Make sure VDB
9980: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
9990: 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
99a0: 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20  ned to every.** 
99b0: 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20          element 
99c0: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
99d0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
99e0: 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54    Fill in the pT
99f0: 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62  abList->a[].pTab
9a00: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53   fields in the S
9a10: 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20  rcList that .** 
9a20: 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20          defines 
9a30: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68  FROM clause.  Wh
9a40: 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20  en views appear 
9a50: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
9a60: 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  se,.**         f
9a70: 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ill pTabList->a[
9a80: 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61  ].pSelect with a
9a90: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
9aa0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
9ab0: 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d           that im
9ac0: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
9ad0: 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61  w.  A copy is ma
9ae0: 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73  de of the view's
9af0: 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
9b00: 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20     statement so 
9b10: 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65  that we can free
9b20: 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c  ly modify or del
9b30: 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ete that stateme
9b40: 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69  nt.**         wi
9b50: 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61  thout worrying a
9b60: 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20  bout messing up 
9b70: 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20 72  the presistent r
9b80: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a  epresentation.**
9b90: 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
9ba0: 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  view..**.**    (
9bb0: 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f  3)  Add terms to
9bc0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
9bd0: 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20  e to accomodate 
9be0: 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
9bf0: 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ord.**         o
9c00: 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20  n joins and the 
9c10: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
9c20: 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a  use of joins..**
9c30: 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e  .**    (4)  Scan
9c40: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c   the list of col
9c50: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
9c60: 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20  lt set (pEList) 
9c70: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  looking.**      
9c80: 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73     for instances
9c90: 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72   of the "*" oper
9ca0: 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c  ator or the TABL
9cb0: 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  E.* operator..**
9cc0: 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e           If foun
9cd0: 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22  d, expand each "
9ce0: 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  *" to be every c
9cf0: 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74  olumn in every t
9d00: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  able.**         
9d10: 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62  and TABLE.* to b
9d20: 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
9d30: 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52  n TABLE..**.** R
9d40: 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65  eturn 0 on succe
9d50: 73 73 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  ss.  If there ar
9d60: 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76  e problems, leav
9d70: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
9d80: 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20  ge.** in pParse 
9d90: 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  and return non-z
9da0: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
9db0: 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d  nt prepSelectStm
9dc0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
9dd0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
9de0: 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a  nt i, j, k, rc;.
9df0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
9e00: 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
9e10: 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  *pEList;.  struc
9e20: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
9e30: 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pFrom;.  sqlite3
9e40: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
9e50: 62 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  b;..  if( p==0 |
9e60: 7c 20 70 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20  | p->pSrc==0 || 
9e70: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9e80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
9e90: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74  ;.  }.  pTabList
9ea0: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
9eb0: 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
9ec0: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
9ed0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
9ee0: 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
9ef0: 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69  ned to all entri
9f00: 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46  es in.  ** the F
9f10: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
9f20: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
9f30: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  nt..  */.  sqlit
9f40: 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
9f50: 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
9f60: 2d 3e 70 53 72 63 29 3b 0a 0a 20 20 2f 2a 20 4c  ->pSrc);..  /* L
9f70: 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
9f80: 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  le named in the 
9f90: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
9fa0: 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20  he select.  If. 
9fb0: 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   ** an entry of 
9fc0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
9fd0: 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e  is a subquery in
9fe0: 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65  stead of a table
9ff0: 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74   or view,.  ** t
a000: 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61  hen create a tra
a010: 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
a020: 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69  ucture to descri
a030: 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  be the subquery.
a040: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
a050: 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
a060: 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
a070: 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
a080: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
a090: 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46  pTab;.    if( pF
a0a0: 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a  rom->pTab!=0 ){.
a0b0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74        /* This st
a0c0: 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65  atement has alre
a0d0: 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65  ady been prepare
a0e0: 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  d.  There is no 
a0f0: 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  need.      ** to
a100: 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a   go further. */.
a110: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d        assert( i=
a120: 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  =0 );.      retu
a130: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
a140: 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  if( pFrom->zName
a150: 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
a160: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
a170: 45 52 59 0a 20 20 20 20 20 20 2f 2a 20 41 20 73  ERY.      /* A s
a180: 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
a190: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
a1a0: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
a1b0: 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
a1c0: 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20  pSelect!=0 );.  
a1d0: 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a      if( pFrom->z
a1e0: 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20  Alias==0 ){.    
a1f0: 20 20 20 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61      pFrom->zAlia
a200: 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71  s =.          sq
a210: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
a220: 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72   "sqlite_subquer
a230: 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70  y_%p_", (void*)p
a240: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  From->pSelect);.
a250: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
a260: 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
a270: 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46  b==0 );.      pF
a280: 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
a290: 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69   = .        sqli
a2a0: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
a2b0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 46 72  lect(pParse, pFr
a2c0: 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20 70 46 72 6f  om->zAlias, pFro
a2d0: 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
a2e0: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
a2f0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
a300: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
a310: 20 20 2f 2a 20 54 68 65 20 69 73 45 70 68 65 6d    /* The isEphem
a320: 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20   flag indicates 
a330: 74 68 61 74 20 74 68 65 20 54 61 62 6c 65 20 73  that the Table s
a340: 74 72 75 63 74 75 72 65 20 68 61 73 20 62 65 65  tructure has bee
a350: 6e 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d  n.      ** dynam
a360: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
a370: 20 61 6e 64 20 6d 61 79 20 62 65 20 66 72 65 65   and may be free
a380: 64 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 20 20  d at any time.  
a390: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a  In other words,.
a3a0: 20 20 20 20 20 20 2a 2a 20 70 54 61 62 20 69 73        ** pTab is
a3b0: 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f   not pointing to
a3c0: 20 61 20 70 65 72 73 69 73 74 65 6e 74 20 74 61   a persistent ta
a3d0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
a3e0: 61 74 20 64 65 66 69 6e 65 73 0a 20 20 20 20 20  at defines.     
a3f0: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
a400: 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20  schema. */.     
a410: 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d 20 3d   pTab->isEphem =
a420: 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d   1;.#endif.    }
a430: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
a440: 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  n ordinary table
a450: 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e   or view name in
a460: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
a470: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
a480: 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
a490: 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d   );.      pFrom-
a4a0: 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a  >pTab = pTab = .
a4b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
a4c0: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
a4d0: 65 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70  e,pFrom->zName,p
a4e0: 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  From->zDatabase)
a4f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
a500: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
a510: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
a520: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65  .      pTab->nRe
a530: 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  f++;.#if !define
a540: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
a550: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20  EW) || !defined 
a560: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
a570: 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20  TUALTABLE).     
a580: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
a590: 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28  ct || IsVirtual(
a5a0: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
a5b0: 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72   /* We reach her
a5c0: 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74  e if the named t
a5d0: 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79  able is a really
a5e0: 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   a view */.     
a5f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69     if( sqlite3Vi
a600: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
a610: 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
a620: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
a630: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
a640: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46          /* If pF
a650: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  rom->pSelect!=0 
a660: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
a670: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a 20  dealing with a. 
a680: 20 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20 77         ** view w
a690: 69 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20 54  ithin a view.  T
a6a0: 68 65 20 53 45 4c 45 43 54 20 73 74 72 75 63 74  he SELECT struct
a6b0: 75 72 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ure has already 
a6c0: 62 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  been.        ** 
a6d0: 63 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f 75  copied by the ou
a6e0: 74 65 72 20 76 69 65 77 20 73 6f 20 77 65 20 63  ter view so we c
a6f0: 61 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70 79  an skip the copy
a700: 20 73 74 65 70 20 68 65 72 65 0a 20 20 20 20 20   step here.     
a710: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e     ** in the inn
a720: 65 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20 20  er view..       
a730: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
a740: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pFrom->pSelect==
a750: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
a760: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  From->pSelect = 
a770: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
a780: 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65  (db, pTab->pSele
a790: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ct);.        }. 
a7a0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
a7b0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
a7c0: 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65  ocess NATURAL ke
a7d0: 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61  ywords, and ON a
a7e0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
a7f0: 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a   of joins..  */.
a800: 20 20 69 66 28 20 73 71 6c 69 74 65 50 72 6f 63    if( sqliteProc
a810: 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20  essJoin(pParse, 
a820: 70 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a  p) ) return 1;..
a830: 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22    /* For every "
a840: 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  *" that occurs i
a850: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
a860: 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  t, insert the na
a870: 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20  mes of.  ** all 
a880: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
a890: 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20  ables.  And for 
a8a0: 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e  every TABLE.* in
a8b0: 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20  sert the names. 
a8c0: 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d   ** of all colum
a8d0: 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68  ns in TABLE.  Th
a8e0: 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65  e parser inserte
a8f0: 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72  d a special expr
a900: 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68  ession.  ** with
a910: 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72   the TK_ALL oper
a920: 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a  ator for each "*
a930: 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20  " that it found 
a940: 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
a950: 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c  st..  ** The fol
a960: 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74  lowing code just
a970: 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74   has to locate t
a980: 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73  he TK_ALL expres
a990: 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64  sions and expand
a9a0: 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74  .  ** each one t
a9b0: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
a9c0: 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
a9d0: 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
a9e0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f  ** The first loo
a9f0: 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f  p just checks to
aa00: 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
aa10: 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74  e any "*" operat
aa20: 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65  ors.  ** that ne
aa30: 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20  ed expanding..  
aa40: 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  */.  for(k=0; k<
aa50: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
aa60: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
aa70: 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d  E = pEList->a[k]
aa80: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
aa90: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  pE->op==TK_ALL )
aaa0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
aab0: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
aac0: 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26 20  & pE->pRight && 
aad0: 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  pE->pRight->op==
aae0: 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20 20  TK_ALL.         
aaf0: 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26 20  && pE->pLeft && 
ab00: 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pE->pLeft->op==T
ab10: 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20 20  K_ID ) break;.  
ab20: 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 69 66  }.  rc = 0;.  if
ab30: 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ( k<pEList->nExp
ab40: 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  r ){.    /*.    
ab50: 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72  ** If we get her
ab60: 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72  e it means the r
ab70: 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69  esult set contai
ab80: 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22  ns one or more "
ab90: 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  *".    ** operat
aba0: 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
abb0: 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c   be expanded.  L
abc0: 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
abd0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
abe0: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
abf0: 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20   set and expand 
ac00: 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  them one by one.
ac10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75  .    */.    stru
ac20: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
ac30: 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b   *a = pEList->a;
ac40: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
ac50: 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  New = 0;.    int
ac60: 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d   flags = pParse-
ac70: 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  >db->flags;.    
ac80: 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20  int longNames = 
ac90: 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
aca0: 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
acb0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
acc0: 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 73            (flags
acd0: 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
ace0: 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20  olNames)==0;..  
acf0: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
ad00: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
ad10: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
ad20: 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20   = a[k].pExpr;. 
ad30: 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21       if( pE->op!
ad40: 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20  =TK_ALL &&.     
ad50: 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54        (pE->op!=T
ad60: 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69  K_DOT || pE->pRi
ad70: 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52  ght==0 || pE->pR
ad80: 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ight->op!=TK_ALL
ad90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
ada0: 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
adb0: 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
adc0: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  not need to be e
add0: 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20  xpanded..       
ade0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
adf0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
ae00: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
ae10: 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70   pNew, a[k].pExp
ae20: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 0);.        i
ae30: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
ae40: 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
ae50: 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d  w->nExpr-1].zNam
ae60: 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a  e = a[k].zName;.
ae70: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
ae80: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
ae90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
aea0: 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20     a[k].pExpr = 
aeb0: 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  0;.        a[k].
aec0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
aed0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
aee0: 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69  /* This expressi
aef0: 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61  on is a "*" or a
af00: 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e   "TABLE.*" and n
af10: 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20  eeds to be.     
af20: 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20     ** expanded. 
af30: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  */.        int t
af40: 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20  ableSeen = 0;   
af50: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77     /* Set to 1 w
af60: 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65  hen TABLE matche
af70: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  s */.        cha
af80: 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20  r *zTName;      
af90: 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
afa0: 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
afb0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
afc0: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
afd0: 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pE->pLeft ){.   
afe0: 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
aff0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
b000: 6f 6b 65 6e 28 64 62 2c 20 26 70 45 2d 3e 70 4c  oken(db, &pE->pL
b010: 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  eft->token);.   
b020: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b030: 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30        zTName = 0
b040: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b050: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
b060: 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
b070: 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
b080: 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
b090: 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65  .          Table
b0a0: 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
b0b0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
b0c0: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
b0d0: 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a   pFrom->zAlias;.
b0e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
b0f0: 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61  abName==0 || zTa
b100: 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a  bName[0]==0 ){ .
b110: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
b120: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
b130: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  me;.          }.
b140: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
b150: 4e 61 6d 65 20 26 26 20 28 7a 54 61 62 4e 61 6d  Name && (zTabNam
b160: 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65  e==0 || zTabName
b170: 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20  [0]==0 || .     
b180: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
b190: 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d  te3StrICmp(zTNam
b1a0: 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 29  e, zTabName)!=0)
b1b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b1c0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
b1d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b1e0: 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20  tableSeen = 1;. 
b1f0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
b200: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
b210: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
b220: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a    Expr *pExpr, *
b230: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
b240: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
b250: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
b260: 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20  zName;..        
b270: 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75      /* If a colu
b280: 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  mn is marked as 
b290: 27 68 69 64 64 65 6e 27 20 28 63 75 72 72 65 6e  'hidden' (curren
b2a0: 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c  tly only possibl
b2b0: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
b2c0: 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62   for virtual tab
b2d0: 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63  les), do not inc
b2e0: 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65 20 65  lude it in the e
b2f0: 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20  xpanded.        
b300: 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65      ** result-se
b310: 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20  t list..        
b320: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
b330: 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e 43     if( IsHiddenC
b340: 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
b350: 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  l[j]) ){.       
b360: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 49 73         assert(Is
b370: 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b 0a  Virtual(pTab));.
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
b390: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
b3a0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
b3b0: 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20     if( i>0 ){.  
b3c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
b3d0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
b3e0: 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62 4c 69  *pLeft = &pTabLi
b3f0: 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20  st->a[i-1];.    
b400: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
b410: 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65  Left[1].jointype
b420: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
b430: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
b440: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
b450: 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e  umnIndex(pLeft->
b460: 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  pTab, zName)>=0 
b470: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
b480: 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
b490: 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
b4a0: 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
b4b0: 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
b4c0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
b4d0: 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  e on the right *
b4e0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
b4f0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
b500: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b510: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
b520: 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
b530: 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73 69 6e 67  (pLeft[1].pUsing
b540: 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b560: 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
b570: 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
b580: 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
b590: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
b5a0: 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c       ** using cl
b5b0: 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61  ause from the ta
b5c0: 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
b5d0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
b5e0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
b600: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
b610: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
b620: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
b630: 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c  Parse, TK_ID, 0,
b640: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
b650: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 3d 3d      if( pRight==
b660: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
b670: 20 20 20 20 20 20 20 73 65 74 51 75 6f 74 65 64         setQuoted
b680: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 26 70  Token(pParse, &p
b690: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e  Right->token, zN
b6a0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
b6b0: 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 26    if( zTabName &
b6c0: 26 20 28 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20  & (longNames || 
b6d0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
b6e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
b6f0: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
b700: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
b710: 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20  arse, TK_ID, 0, 
b720: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
b730: 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
b740: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
b750: 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
b760: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
b770: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
b780: 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Expr==0 ) break;
b790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
b7a0: 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50  etQuotedToken(pP
b7b0: 61 72 73 65 2c 20 26 70 4c 65 66 74 2d 3e 74 6f  arse, &pLeft->to
b7c0: 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a  ken, zTabName);.
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
b7e0: 74 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e 73  tToken(&pExpr->s
b7f0: 70 61 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  pan, .          
b800: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
b810: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
b820: 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e  s", zTabName, zN
b830: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ame));.         
b840: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
b850: 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  .dyn = 1;.      
b860: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
b870: 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20  oken.z = 0;.    
b880: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
b890: 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20  >token.n = 0;.  
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
b8b0: 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30  r->token.dyn = 0
b8c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
b8d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
b8e0: 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68     pExpr = pRigh
b8f0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
b900: 20 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70   pExpr->span = p
b910: 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Expr->token;.   
b920: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
b930: 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 30 3b 0a  ->span.dyn = 0;.
b940: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
b950: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
b960: 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  ngNames ){.     
b970: 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
b980: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
b990: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
b9a0: 65 77 2c 20 70 45 78 70 72 2c 20 26 70 45 78 70  ew, pExpr, &pExp
b9b0: 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20  r->span);.      
b9c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b9d0: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
b9e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
b9f0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
ba00: 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70 52  pNew, pExpr, &pR
ba10: 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  ight->token);.  
ba20: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ba30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ba40: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74  }.        if( !t
ba50: 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20  ableSeen ){.    
ba60: 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
ba70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ba80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ba90: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
baa0: 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e   table: %s", zTN
bab0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
bac0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
bad0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
bae0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74  sg(pParse, "no t
baf0: 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22  ables specified"
bb00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
bb10: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
bb20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bb30: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
bb40: 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  zTName);.      }
bb50: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
bb60: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
bb70: 28 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  (pEList);.    p-
bb80: 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  >pEList = pNew;.
bb90: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c    }.  if( p->pEL
bba0: 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74  ist && p->pEList
bbb0: 2d 3e 6e 45 78 70 72 3e 53 51 4c 49 54 45 5f 4d  ->nExpr>SQLITE_M
bbc0: 41 58 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  AX_COLUMN ){.   
bbd0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
bbe0: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
bbf0: 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65  ny columns in re
bc00: 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 20 20  sult set");.    
bc10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
bc20: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d  R;.  }.  if( db-
bc30: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
bc40: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
bc50: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65  _NOMEM;.  }.  re
bc60: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
bc70: 2a 20 70 45 20 69 73 20 61 20 70 6f 69 6e 74 65  * pE is a pointe
bc80: 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  r to an expressi
bc90: 6f 6e 20 77 68 69 63 68 20 69 73 20 61 20 73 69  on which is a si
bca0: 6e 67 6c 65 20 74 65 72 6d 20 69 6e 0a 2a 2a 20  ngle term in.** 
bcb0: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
bcc0: 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  P BY clause..**.
bcd0: 2a 2a 20 49 66 20 70 45 20 65 76 61 6c 75 61 74  ** If pE evaluat
bce0: 65 73 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  es to an integer
bcf0: 20 63 6f 6e 73 74 61 6e 74 20 69 2c 20 74 68 65   constant i, the
bd00: 6e 20 72 65 74 75 72 6e 20 69 2e 0a 2a 2a 20 54  n return i..** T
bd10: 68 69 73 20 69 73 20 61 6e 20 69 6e 64 69 63 61  his is an indica
bd20: 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 61 6c 6c  tion to the call
bd30: 65 72 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c  er that it shoul
bd40: 64 20 73 6f 72 74 0a 2a 2a 20 62 79 20 74 68 65  d sort.** by the
bd50: 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   i-th column of 
bd60: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
bd70: 2a 2a 0a 2a 2a 20 49 66 20 70 45 20 69 73 20 61  **.** If pE is a
bd80: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 65 78 70   well-formed exp
bd90: 72 65 73 73 69 6f 6e 20 61 6e 64 20 74 68 65 20  ression and the 
bda0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
bdb0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6f  .** is not compo
bdc0: 75 6e 64 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  und, then return
bdd0: 20 30 2e 20 20 54 68 69 73 20 69 6e 64 69 63 61   0.  This indica
bde0: 74 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61  tes to the.** ca
bdf0: 6c 6c 65 72 20 74 68 61 74 20 69 74 20 73 68 6f  ller that it sho
be00: 75 6c 64 20 73 6f 72 74 20 62 79 20 74 68 65 20  uld sort by the 
be10: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4f 52 44  value of the ORD
be20: 45 52 20 42 59 0a 2a 2a 20 65 78 70 72 65 73 73  ER BY.** express
be30: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
be40: 65 20 53 45 4c 45 43 54 20 69 73 20 63 6f 6d 70  e SELECT is comp
be50: 6f 75 6e 64 2c 20 74 68 65 6e 20 61 74 74 65 6d  ound, then attem
be60: 70 74 20 74 6f 20 6d 61 74 63 68 20 70 45 20 61  pt to match pE a
be70: 67 61 69 6e 73 74 0a 2a 2a 20 72 65 73 75 6c 74  gainst.** result
be80: 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   set columns in 
be90: 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 53 45  the left-most SE
bea0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
beb0: 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 69   Return.** the i
bec0: 6e 64 65 78 20 69 20 6f 66 20 74 68 65 20 6d 61  ndex i of the ma
bed0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20 61  tching column, a
bee0: 73 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20  s an indication 
bef0: 74 6f 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  to the .** calle
bf00: 72 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64  r that it should
bf10: 20 73 6f 72 74 20 62 79 20 74 68 65 20 69 2d 74   sort by the i-t
bf20: 68 20 63 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68  h column.  If th
bf30: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 6d 61 74  ere is.** no mat
bf40: 63 68 2c 20 72 65 74 75 72 6e 20 2d 31 20 61 6e  ch, return -1 an
bf50: 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  d leave an error
bf60: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
bf70: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
bf80: 74 20 6d 61 74 63 68 4f 72 64 65 72 42 79 54 65  t matchOrderByTe
bf90: 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 0a 20 20  rmToExprList(.  
bfa0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
bfb0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
bfc0: 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20  ntext for error 
bfd0: 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53 65  messages */.  Se
bfe0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
bff0: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
c000: 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20 74 68  tatement with th
c010: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
c020: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 2c  e */.  Expr *pE,
c030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
c040: 20 73 70 65 63 69 66 69 63 20 4f 52 44 45 52 20   specific ORDER 
c050: 42 59 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  BY term */.  int
c060: 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20   idx,           
c070: 2f 2a 20 57 68 65 6e 20 4f 52 44 45 52 20 42 59  /* When ORDER BY
c080: 20 74 65 72 6d 20 69 73 20 74 68 69 73 20 2a 2f   term is this */
c090: 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6f 75 6e  .  int isCompoun
c0a0: 64 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  d,    /* True if
c0b0: 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 70 6f   this is a compo
c0c0: 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  und SELECT */.  
c0d0: 75 38 20 2a 70 48 61 73 41 67 67 20 20 20 20 20  u8 *pHasAgg     
c0e0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 78     /* True if ex
c0f0: 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  pression contain
c100: 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
c110: 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tions */.){.  in
c120: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
c130: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
c140: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
c150: 70 45 4c 69 73 74 3b 20 20 2f 2a 20 54 68 65 20  pEList;  /* The 
c160: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 72  columns of the r
c170: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 4e  esult set */.  N
c180: 61 6d 65 43 6f 6e 74 65 78 74 20 6e 63 3b 20 20  ameContext nc;  
c190: 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
c1a0: 74 20 66 6f 72 20 72 65 73 6f 6c 76 69 6e 67 20  t for resolving 
c1b0: 70 45 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 49 66 20  pE */...  /* If 
c1c0: 74 68 65 20 74 65 72 6d 20 69 73 20 61 6e 20 69  the term is an i
c1d0: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2c  nteger constant,
c1e0: 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   return the valu
c1f0: 65 20 6f 66 20 74 68 61 74 0a 20 20 2a 2a 20 63  e of that.  ** c
c200: 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 70 45 4c  onstant */.  pEL
c210: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
c220: 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71 6c  EList;.  if( sql
c230: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
c240: 72 28 70 45 2c 20 26 69 29 20 29 7b 0a 20 20 20  r(pE, &i) ){.   
c250: 20 69 66 28 20 69 3c 3d 30 20 29 7b 0a 20 20 20   if( i<=0 ){.   
c260: 20 20 20 2f 2a 20 49 66 20 69 20 69 73 20 74 6f     /* If i is to
c270: 6f 20 73 6d 61 6c 6c 2c 20 6d 61 6b 65 20 69 74  o small, make it
c280: 20 74 6f 6f 20 62 69 67 2e 20 20 54 68 61 74 20   too big.  That 
c290: 77 61 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a  way the calling.
c2a0: 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
c2b0: 6e 20 73 74 69 6c 6c 20 73 65 65 73 20 61 20 76  n still sees a v
c2c0: 61 6c 75 65 20 74 68 61 74 20 69 73 20 6f 75 74  alue that is out
c2d0: 20 6f 66 20 72 61 6e 67 65 2c 20 62 75 74 20 64   of range, but d
c2e0: 6f 65 73 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74  oes.      ** not
c2f0: 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 6f 6c   confuse the col
c300: 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 20  umn number with 
c310: 30 20 6f 72 20 2d 31 20 72 65 73 75 6c 74 20 63  0 or -1 result c
c320: 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ode..      */.  
c330: 20 20 20 20 69 20 3d 20 70 45 4c 69 73 74 2d 3e      i = pEList->
c340: 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 7d 0a 20  nExpr+1;.    }. 
c350: 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d     return i;.  }
c360: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 65  ..  /* If the te
c370: 72 6d 20 69 73 20 61 20 73 69 6d 70 6c 65 20 69  rm is a simple i
c380: 64 65 6e 74 69 66 69 65 72 20 74 68 61 74 20 74  dentifier that t
c390: 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 61 74  ry to match that
c3a0: 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 2a 2a   identifier.  **
c3b0: 20 61 67 61 69 6e 73 74 20 61 20 63 6f 6c 75 6d   against a colum
c3c0: 6e 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 72 65  n name in the re
c3d0: 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  sult set..  */. 
c3e0: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
c3f0: 49 44 20 7c 7c 20 28 70 45 2d 3e 6f 70 3d 3d 54  ID || (pE->op==T
c400: 4b 5f 53 54 52 49 4e 47 20 26 26 20 70 45 2d 3e  K_STRING && pE->
c410: 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 27 5c 27 27  token.z[0]!='\''
c420: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
c430: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
c440: 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  b;.    char *zCo
c450: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
c460: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 26 70 45  romToken(db, &pE
c470: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66  ->token);.    if
c480: 28 20 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zCol==0 ){.   
c490: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
c4a0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
c4b0: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
c4c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68  ; i++){.      ch
c4d0: 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74  ar *zAs = pEList
c4e0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
c4f0: 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26      if( zAs!=0 &
c500: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
c510: 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  (zAs, zCol)==0 )
c520: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
c530: 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20  3_free(zCol);.  
c540: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 2b 31        return i+1
c550: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c560: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c570: 28 7a 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  (zCol);.  }..  /
c580: 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e 61  * Resolve all na
c590: 6d 65 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  mes in the ORDER
c5a0: 20 42 59 20 74 65 72 6d 20 65 78 70 72 65 73 73   BY term express
c5b0: 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  ion.  */.  memse
c5c0: 74 28 26 6e 63 2c 20 30 2c 20 73 69 7a 65 6f 66  t(&nc, 0, sizeof
c5d0: 28 6e 63 29 29 3b 0a 20 20 6e 63 2e 70 50 61 72  (nc));.  nc.pPar
c5e0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 6e  se = pParse;.  n
c5f0: 63 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65  c.pSrcList = pSe
c600: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 6e 63  lect->pSrc;.  nc
c610: 2e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74  .pEList = pEList
c620: 3b 0a 20 20 6e 63 2e 61 6c 6c 6f 77 41 67 67 20  ;.  nc.allowAgg 
c630: 3d 20 31 3b 0a 20 20 6e 63 2e 6e 45 72 72 20 3d  = 1;.  nc.nErr =
c640: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
c650: 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
c660: 73 28 26 6e 63 2c 20 70 45 29 20 29 7b 0a 20 20  s(&nc, pE) ){.  
c670: 20 20 69 66 28 20 69 73 43 6f 6d 70 6f 75 6e 64    if( isCompound
c680: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c690: 33 45 72 72 6f 72 43 6c 65 61 72 28 70 50 61 72  3ErrorClear(pPar
c6a0: 73 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  se);.      retur
c6b0: 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n 0;.    }else{.
c6c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
c6d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c6e0: 20 6e 63 2e 68 61 73 41 67 67 20 26 26 20 70 48   nc.hasAgg && pH
c6f0: 61 73 41 67 67 20 29 7b 0a 20 20 20 20 2a 70 48  asAgg ){.    *pH
c700: 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a 0a  asAgg = 1;.  }..
c710: 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 6d 70 6f    /* For a compo
c720: 75 6e 64 20 53 45 4c 45 43 54 2c 20 77 65 20 6e  und SELECT, we n
c730: 65 65 64 20 74 6f 20 74 72 79 20 74 6f 20 6d 61  eed to try to ma
c740: 74 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  tch the ORDER BY
c750: 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
c760: 20 61 67 61 69 6e 73 74 20 61 6e 20 65 78 70 72   against an expr
c770: 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65  ession in the re
c780: 73 75 6c 74 20 73 65 74 0a 20 20 2a 2f 0a 20 20  sult set.  */.  
c790: 69 66 28 20 69 73 43 6f 6d 70 6f 75 6e 64 20 29  if( isCompound )
c7a0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
c7b0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
c7c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
c7d0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
c7e0: 72 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  re(pEList->a[i].
c7f0: 70 45 78 70 72 2c 20 70 45 29 20 29 7b 0a 20 20  pExpr, pE) ){.  
c800: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 2b 31        return i+1
c810: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c820: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
c830: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  }.../*.** Analyz
c840: 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 6f  e and ORDER BY o
c850: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
c860: 65 20 69 6e 20 61 20 73 69 6d 70 6c 65 20 53 45  e in a simple SE
c870: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
c880: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
c890: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73  mber of errors s
c8a0: 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  een..**.** Every
c8b0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
c8c0: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
c8d0: 59 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74  Y clause needs t
c8e0: 6f 20 62 65 20 61 6e 0a 2a 2a 20 65 78 70 72 65  o be an.** expre
c8f0: 73 73 69 6f 6e 2e 20 20 49 66 20 61 6e 79 20 65  ssion.  If any e
c900: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20  xpression is an 
c910: 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  integer constant
c920: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 61 74 20 65  , then.** that e
c930: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 70  xpression is rep
c940: 6c 61 63 65 64 20 62 79 20 74 68 65 20 63 6f 72  laced by the cor
c950: 72 65 73 70 6f 6e 64 69 6e 67 20 0a 2a 2a 20 65  responding .** e
c960: 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74  xpression from t
c970: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
c980: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
c990: 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79  cessOrderGroupBy
c9a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c9b0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
c9c0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20 4c  sing context.  L
c9d0: 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61  eave error messa
c9e0: 67 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65  ges here */.  Se
c9f0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
ca00: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
ca10: 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74  T statement cont
ca20: 61 69 6e 69 6e 67 20 74 68 65 20 63 6c 61 75 73  aining the claus
ca30: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
ca40: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
ca50: 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20  The ORDER BY or 
ca60: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
ca70: 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64 20  to be processed 
ca80: 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 72 64 65 72  */.  int isOrder
ca90: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20  ,          /* 1 
caa0: 66 6f 72 20 4f 52 44 45 52 20 42 59 2e 20 20 30  for ORDER BY.  0
cab0: 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 2a 2f   for GROUP BY */
cac0: 0a 20 20 75 38 20 2a 70 48 61 73 41 67 67 20 20  .  u8 *pHasAgg  
cad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
cae0: 74 6f 20 54 52 55 45 20 69 66 20 61 6e 79 20 74  to TRUE if any t
caf0: 65 72 6d 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  erm contains an 
cb00: 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 29 7b 0a  aggregate */.){.
cb10: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
cb20: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
cb30: 3e 64 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  >db;.  ExprList 
cb40: 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  *pEList;..  if( 
cb50: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
cb60: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 4f  turn 0;.  if( pO
cb70: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 53 51  rderBy->nExpr>SQ
cb80: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20  LITE_MAX_COLUMN 
cb90: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
cba0: 72 20 2a 7a 54 79 70 65 20 3d 20 69 73 4f 72 64  r *zType = isOrd
cbb0: 65 72 20 3f 20 22 4f 52 44 45 52 22 20 3a 20 22  er ? "ORDER" : "
cbc0: 47 52 4f 55 50 22 3b 0a 20 20 20 20 73 71 6c 69  GROUP";.    sqli
cbd0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
cbe0: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65  se, "too many te
cbf0: 72 6d 73 20 69 6e 20 25 73 20 42 59 20 63 6c 61  rms in %s BY cla
cc00: 75 73 65 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20  use", zType);.  
cc10: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
cc20: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
cc30: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66  ct->pEList;.  if
cc40: 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  ( pEList==0 ){. 
cc50: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
cc60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
cc70: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
cc80: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  ++){.    int iCo
cc90: 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  l;.    Expr *pE 
cca0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
ccb0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 43 6f 6c  .pExpr;.    iCol
ccc0: 20 3d 20 6d 61 74 63 68 4f 72 64 65 72 42 79 54   = matchOrderByT
ccd0: 65 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 70 50  ermToExprList(pP
cce0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 70  arse, pSelect, p
ccf0: 45 2c 20 69 2b 31 2c 20 30 2c 20 70 48 61 73 41  E, i+1, 0, pHasA
cd00: 67 67 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  gg);.    if( iCo
cd10: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  l<0 ){.      ret
cd20: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
cd30: 20 69 66 28 20 69 43 6f 6c 3e 70 45 4c 69 73 74   if( iCol>pEList
cd40: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
cd50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
cd60: 70 65 20 3d 20 69 73 4f 72 64 65 72 20 3f 20 22  pe = isOrder ? "
cd70: 4f 52 44 45 52 22 20 3a 20 22 47 52 4f 55 50 22  ORDER" : "GROUP"
cd80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
cd90: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
cda0: 0a 20 20 20 20 20 20 20 20 20 22 25 72 20 25 73  .         "%r %s
cdb0: 20 42 59 20 74 65 72 6d 20 6f 75 74 20 6f 66 20   BY term out of 
cdc0: 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62  range - should b
cdd0: 65 20 22 0a 20 20 20 20 20 20 20 20 20 22 62 65  e ".         "be
cde0: 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c  tween 1 and %d",
cdf0: 20 69 2b 31 2c 20 7a 54 79 70 65 2c 20 70 45 4c   i+1, zType, pEL
ce00: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
ce10: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
ce20: 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e   }.    if( iCol>
ce30: 30 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  0 ){.      CollS
ce40: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 45 2d 3e  eq *pColl = pE->
ce50: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 6e 74  pColl;.      int
ce60: 20 66 6c 61 67 73 20 3d 20 70 45 2d 3e 66 6c 61   flags = pE->fla
ce70: 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
ce80: 74 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  te;.      sqlite
ce90: 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b  3ExprDelete(pE);
cea0: 0a 20 20 20 20 20 20 70 45 20 3d 20 73 71 6c 69  .      pE = sqli
ceb0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
cec0: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31 5d  EList->a[iCol-1]
ced0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70  .pExpr);.      p
cee0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
cef0: 78 70 72 20 3d 20 70 45 3b 0a 20 20 20 20 20 20  xpr = pE;.      
cf00: 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 66 6c 61  if( pColl && fla
cf10: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  gs ){.        pE
cf20: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b  ->pColl = pColl;
cf30: 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 66 6c 61  .        pE->fla
cf40: 67 73 20 7c 3d 20 66 6c 61 67 73 3b 0a 20 20 20  gs |= flags;.   
cf50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
cf60: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
cf70: 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20  .** Analyze and 
cf80: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
cf90: 50 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61  P BY clause in a
cfa0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
cfb0: 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  t.  Return.** th
cfc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
cfd0: 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 54  rs seen..**.** T
cfe0: 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 64 65  he processing de
cff0: 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72  pends on whether
d000: 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 73   the SELECT is s
d010: 69 6d 70 6c 65 20 6f 72 20 63 6f 6d 70 6f 75 6e  imple or compoun
d020: 64 2e 0a 2a 2a 20 46 6f 72 20 61 20 73 69 6d 70  d..** For a simp
d030: 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  le SELECT statem
d040: 65 6e 74 2c 20 65 76 72 79 20 74 65 72 6d 20 6f  ent, evry term o
d050: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6f  f the ORDER BY o
d060: 72 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 63 6c  r GROUP BY.** cl
d070: 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 62 65  ause needs to be
d080: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20   an expression. 
d090: 20 49 66 20 61 6e 79 20 65 78 70 72 65 73 73 69   If any expressi
d0a0: 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  on is an integer
d0b0: 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68  .** constant, th
d0c0: 65 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69  en that expressi
d0d0: 6f 6e 20 69 73 20 72 65 70 6c 61 63 65 64 20 62  on is replaced b
d0e0: 79 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  y the correspond
d0f0: 69 6e 67 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  ing .** expressi
d100: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75  on from the resu
d110: 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  lt set..**.** Fo
d120: 72 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  r compound SELEC
d130: 54 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 65 76  T statements, ev
d140: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  ery expression n
d150: 65 65 64 73 20 74 6f 20 62 65 20 6f 66 0a 2a 2a  eeds to be of.**
d160: 20 74 79 70 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20   type TK_COLUMN 
d170: 77 69 74 68 20 61 20 69 54 61 62 6c 65 20 76 61  with a iTable va
d180: 6c 75 65 20 61 73 20 67 69 76 65 6e 20 69 6e 20  lue as given in 
d190: 74 68 65 20 34 74 68 20 70 61 72 61 6d 65 74 65  the 4th paramete
d1a0: 72 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 65 78 70  r..** If any exp
d1b0: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e  ression is an in
d1c0: 74 65 67 65 72 2c 20 74 68 61 74 20 62 65 63 6f  teger, that beco
d1d0: 6d 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  mes the column n
d1e0: 75 6d 62 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77  umber..** Otherw
d1f0: 69 73 65 2c 20 6d 61 74 63 68 20 74 68 65 20 65  ise, match the e
d200: 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 73  xpression agains
d210: 74 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c  t result set col
d220: 75 6d 6e 73 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  umns from.** the
d230: 20 6c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43   left-most SELEC
d240: 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
d250: 20 70 72 6f 63 65 73 73 43 6f 6d 70 6f 75 6e 64   processCompound
d260: 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
d270: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
d280: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d290: 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72 6f  ext.  Leave erro
d2a0: 72 20 6d 65 73 73 61 67 65 73 20 68 65 72 65 20  r messages here 
d2b0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
d2c0: 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54 68  lect,      /* Th
d2d0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
d2e0: 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  nt containing th
d2f0: 65 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20  e ORDER BY */.  
d300: 69 6e 74 20 69 54 61 62 6c 65 20 20 20 20 20 20  int iTable      
d310: 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
d320: 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 6f 75  table for compou
d330: 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
d340: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
d350: 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   i;.  ExprList *
d360: 70 4f 72 64 65 72 42 79 3b 0a 20 20 45 78 70 72  pOrderBy;.  Expr
d370: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
d380: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
d390: 6e 74 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b  nt moreToDo = 1;
d3a0: 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ..  pOrderBy = p
d3b0: 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79  Select->pOrderBy
d3c0: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
d3d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
d3e0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e    if( pOrderBy->
d3f0: 6e 45 78 70 72 3e 53 51 4c 49 54 45 5f 4d 41 58  nExpr>SQLITE_MAX
d400: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 73  _COLUMN ){.    s
d410: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d420: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
d430: 20 74 65 72 6d 73 20 69 6e 20 4f 52 44 45 52 20   terms in ORDER 
d440: 42 59 20 63 6c 61 75 73 65 22 29 3b 0a 20 20 20  BY clause");.   
d450: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
d460: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
d470: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
d480: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
d490: 69 2b 2b 29 7b 0a 20 20 20 20 70 4f 72 64 65 72  i++){.    pOrder
d4a0: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20  By->a[i].done = 
d4b0: 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  0;.  }.  while( 
d4c0: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
d4d0: 29 7b 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d  ){.    pSelect =
d4e0: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
d4f0: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
d500: 53 65 6c 65 63 74 20 26 26 20 6d 6f 72 65 54 6f  Select && moreTo
d510: 44 6f 20 29 7b 0a 20 20 20 20 6d 6f 72 65 54 6f  Do ){.    moreTo
d520: 44 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  Do = 0;.    for(
d530: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
d540: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
d550: 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
d560: 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70      Expr *pE, *p
d570: 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Dup;.      if( p
d580: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f  OrderBy->a[i].do
d590: 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ne ) continue;. 
d5a0: 20 20 20 20 20 70 45 20 3d 20 70 4f 72 64 65 72       pE = pOrder
d5b0: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
d5c0: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
d5d0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
d5e0: 70 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pE);.      if( p
d5f0: 44 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Dup==0 ){.      
d600: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
d610: 20 20 7d 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d    }.      iCol =
d620: 20 6d 61 74 63 68 4f 72 64 65 72 42 79 54 65 72   matchOrderByTer
d630: 6d 54 6f 45 78 70 72 4c 69 73 74 28 70 50 61 72  mToExprList(pPar
d640: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 44 75  se, pSelect, pDu
d650: 70 2c 20 69 2b 31 2c 20 31 2c 20 30 29 3b 0a 20  p, i+1, 1, 0);. 
d660: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d670: 44 65 6c 65 74 65 28 70 44 75 70 29 3b 0a 20 20  Delete(pDup);.  
d680: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
d690: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
d6a0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
d6b0: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
d6c0: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ct->pEList;.    
d6d0: 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
d6e0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
d6f0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
d700: 20 20 20 69 66 28 20 69 43 6f 6c 3e 70 45 4c 69     if( iCol>pELi
d710: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
d720: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
d730: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
d740: 20 20 20 20 20 20 20 20 20 22 25 72 20 4f 52 44           "%r ORD
d750: 45 52 20 42 59 20 74 65 72 6d 20 6f 75 74 20 6f  ER BY term out o
d760: 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64  f range - should
d770: 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20 20   be ".          
d780: 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20   "between 1 and 
d790: 25 64 22 2c 20 69 2b 31 2c 20 70 45 4c 69 73 74  %d", i+1, pEList
d7a0: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
d7b0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
d7c0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43    }.      if( iC
d7d0: 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol>0 ){.        
d7e0: 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pE->op = TK_COLU
d7f0: 4d 4e 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e  MN;.        pE->
d800: 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b  iTable = iTable;
d810: 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 69 41 67  .        pE->iAg
d820: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  g = -1;.        
d830: 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43  pE->iColumn = iC
d840: 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 45  ol-1;.        pE
d850: 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ->pTab = 0;.    
d860: 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
d870: 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  i].done = 1;.   
d880: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d890: 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a    moreToDo = 1;.
d8a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d8b0: 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c    pSelect = pSel
d8c0: 65 63 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ect->pNext;.  }.
d8d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
d8e0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
d8f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64  +){.    if( pOrd
d900: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 3d  erBy->a[i].done=
d910: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
d920: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d930: 73 65 2c 20 22 25 72 20 4f 52 44 45 52 20 42 59  se, "%r ORDER BY
d940: 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d   term does not m
d950: 61 74 63 68 20 61 6e 79 20 22 0a 20 20 20 20 20  atch any ".     
d960: 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 20 69         "column i
d970: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
d980: 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 72  ", i+1);.      r
d990: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
d9a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
d9b0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44  ../*.** Get a VD
d9c0: 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  BE for the given
d9d0: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e   parser context.
d9e0: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
d9f0: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
da00: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
da10: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
da20: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20  ULL and leave a 
da30: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
da40: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
da50: 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65  te3GetVdbe(Parse
da60: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
da70: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
da80: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
da90: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
daa0: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
dab0: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50  te3VdbeCreate(pP
dac0: 61 72 73 65 2d 3e 64 62 29 3b 0a 23 69 66 6e 64  arse->db);.#ifnd
dad0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
dae0: 52 41 43 45 0a 20 20 20 20 69 66 28 20 76 20 29  RACE.    if( v )
daf0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
db00: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
db10: 54 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65  Trace);.    }.#e
db20: 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
db30: 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  n v;.}.../*.** C
db40: 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69  ompute the iLimi
db50: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69  t and iOffset fi
db60: 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45  elds of the SELE
db70: 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  CT based on the.
db80: 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  ** pLimit and pO
db90: 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  ffset expression
dba0: 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  s.  pLimit and p
dbb0: 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20  Offset hold the 
dbc0: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
dbd0: 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  hat appear in th
dbe0: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73  e original SQL s
dbf0: 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74  tatement after t
dc00: 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
dc10: 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e  SET.** keywords.
dc20: 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f    Or NULL if tho
dc30: 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  se keywords are 
dc40: 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20  omitted. iLimit 
dc50: 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20  and iOffset .** 
dc60: 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  are the integer 
dc70: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20  memory register 
dc80: 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e  numbers for coun
dc90: 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ters used to com
dca0: 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d  pute .** the lim
dcb0: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20  it and offset.  
dcc0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  If there is no l
dcd0: 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73  imit and/or offs
dce0: 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69  et, then .** iLi
dcf0: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
dd00: 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  are negative..**
dd10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
dd20: 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c   changes the val
dd30: 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e  ues of iLimit an
dd40: 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69  d iOffset only i
dd50: 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20  f.** a limit or 
dd60: 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65  offset is define
dd70: 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20  d by pLimit and 
dd80: 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74  pOffset.  iLimit
dd90: 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20   and.** iOffset 
dda0: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
ddb0: 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f   preset to appro
ddc0: 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76  priate default v
ddd0: 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c  alues.** (usuall
dde0: 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73  y but not always
ddf0: 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61   -1) prior to ca
de00: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
de10: 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70  ne..** Only if p
de20: 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66  Limit!=0 or pOff
de30: 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69  set!=0 do the li
de40: 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65  mit registers ge
de50: 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20  t.** redefined. 
de60: 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
de70: 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69  perator uses thi
de80: 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f  s property to fo
de90: 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65  rce.** the reuse
dea0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d   of the same lim
deb0: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65  it and offset re
dec0: 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d  gisters across m
ded0: 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43  ultiple.** SELEC
dee0: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  T statements..*/
def0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
df00: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
df10: 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
df20: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
df30: 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65   iBreak){.  Vdbe
df40: 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *v = 0;.  int i
df50: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Limit = 0;.  int
df60: 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20   iOffset;.  int 
df70: 61 64 64 72 31 3b 0a 0a 20 20 2f 2a 20 0a 20 20  addr1;..  /* .  
df80: 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c  ** "LIMIT -1" al
df90: 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72  ways shows all r
dfa0: 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73  ows.  There is s
dfb0: 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76  ome.  ** contrav
dfc0: 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20  ersy about what 
dfd0: 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
dfe0: 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a  vior should be..
dff0: 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74    ** The current
e000: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
e010: 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49  interprets "LIMI
e020: 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a  T 0" to mean.  *
e030: 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a  * no rows..  */.
e040: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
e050: 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  ){.    p->iLimit
e060: 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50   = iLimit = ++pP
e070: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
e080: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
e090: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
e0a0: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
e0b0: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  n;.    sqlite3Ex
e0c0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
e0d0: 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74  ->pLimit, iLimit
e0e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
e0f0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
e100: 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74  ustBeInt, iLimit
e110: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
e120: 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
e130: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 73 71  unter"));.    sq
e140: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e150: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c  v, OP_IfZero, iL
e160: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  imit, iBreak);. 
e170: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66   }.  if( p->pOff
e180: 73 65 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4f  set ){.    p->iO
e190: 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20  ffset = iOffset 
e1a0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
e1b0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69  ;.    if( p->pLi
e1c0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  mit ){.      pPa
e1d0: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f  rse->nMem++;   /
e1e0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78  * Allocate an ex
e1f0: 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72  tra register for
e200: 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f   limit+offset */
e210: 0a 20 20 20 20 7d 0a 20 20 20 20 76 20 3d 20 73  .    }.    v = s
e220: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
e230: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
e240: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
e250: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
e260: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66  e(pParse, p->pOf
e270: 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a  fset, iOffset);.
e280: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e290: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
e2a0: 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b  BeInt, iOffset);
e2b0: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
e2c0: 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75  ((v, "OFFSET cou
e2d0: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 61 64 64  nter"));.    add
e2e0: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
e2f0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50  AddOp1(v, OP_IfP
e300: 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  os, iOffset);.  
e310: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e320: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
e330: 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a  r, 0, iOffset);.
e340: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
e350: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
e360: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  );.    if( p->pL
e370: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71  imit ){.      sq
e380: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
e390: 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69  v, OP_Add, iLimi
e3a0: 74 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66  t, iOffset, iOff
e3b0: 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64  set+1);.      Vd
e3c0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
e3d0: 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
e3e0: 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
e3f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
e400: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69  v, OP_IfPos, iLi
e410: 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  mit);.      sqli
e420: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e430: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c   OP_Integer, -1,
e440: 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20   iOffset+1);.   
e450: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
e460: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
e470: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
e480: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
e490: 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
e4a0: 20 75 73 65 20 66 6f 72 20 73 6f 72 74 69 6e 67   use for sorting
e4b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e4c0: 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e   createSortingIn
e4d0: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
e4e0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 45 78  e, Select *p, Ex
e4f0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
e500: 29 7b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  ){.  if( pOrderB
e510: 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  y ){.    int add
e520: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
e530: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
e540: 72 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 64  r==0 );.    pOrd
e550: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d  erBy->iECursor =
e560: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
e570: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
e580: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
e590: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
e5a0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5c0: 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65             pOrde
e5d0: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70  rBy->iECursor, p
e5e0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31  OrderBy->nExpr+1
e5f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
e600: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
e610: 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 70  ] == -1 );.    p
e620: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
e630: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 7d 0a 7d 0a  ] = addr;.  }.}.
e640: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e650: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
e660: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  LECT./*.** Retur
e670: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
e680: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
e690: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f  ence for the iCo
e6a0: 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  l-th column of.*
e6b0: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
e6c0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
e6d0: 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d-select stateme
e6e0: 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20  nt "p".  Return 
e6f0: 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63  NULL if.** the c
e700: 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66  olumn has no def
e710: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ault collating s
e720: 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  equence..**.** T
e730: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
e740: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f  uence for the co
e750: 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73  mpound select is
e760: 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a   taken from the.
e770: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  ** left-most ter
e780: 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  m of the select 
e790: 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61  that has a colla
e7a0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
e7b0: 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
e7c0: 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c   *multiSelectCol
e7d0: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
e7e0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
e7f0: 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c  nt iCol){.  Coll
e800: 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  Seq *pRet;.  if(
e810: 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
e820: 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65    pRet = multiSe
e830: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
e840: 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  se, p->pPrior, i
e850: 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Col);.  }else{. 
e860: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d     pRet = 0;.  }
e870: 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29  .  if( pRet==0 )
e880: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  {.    pRet = sql
e890: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
e8a0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
e8b0: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
e8c0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
e8d0: 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pRet;.}.#endif /
e8e0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
e8f0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
e900: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e910: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
e920: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ELECT./*.** This
e930: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
e940: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20  ed to process a 
e950: 71 75 65 72 79 20 74 68 61 74 20 69 73 20 72 65  query that is re
e960: 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a  ally the union.*
e970: 2a 20 6f 72 20 69 6e 74 65 72 73 65 63 74 69 6f  * or intersectio
e980: 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  n of two or more
e990: 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65   separate querie
e9a0: 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69  s..**.** "p" poi
e9b0: 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74  nts to the right
e9c0: 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f  -most of the two
e9d0: 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71   queries.  the q
e9e0: 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c  uery on the.** l
e9f0: 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72  eft is p->pPrior
ea00: 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72  .  The left quer
ea10: 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  y could also be 
ea20: 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
ea30: 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73  .** in which cas
ea40: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
ea50: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65  ill be called re
ea60: 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a  cursively. .**.*
ea70: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  * The results of
ea80: 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
ea90: 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74   are to be writt
eaa0: 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e  en into a destin
eab0: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65  ation.** of type
eac0: 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61   eDest with para
ead0: 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a  meter iParm..**.
eae0: 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43  ** Example 1:  C
eaf0: 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d  onsider a three-
eb00: 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c  way compound SQL
eb10: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
eb20: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
eb30: 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM t1 UNION SEL
eb40: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e  ECT b FROM t2 UN
eb50: 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f  ION SELECT c FRO
eb60: 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  M t3.**.** This 
eb70: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
eb80: 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77  sed up as follow
eb90: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
eba0: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
ebb0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
ebc0: 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  `----->  SELECT 
ebd0: 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20  b FROM t2.**    
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
ebf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec00: 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54  `------>  SELECT
ec10: 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a   a FROM t1.**.**
ec20: 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74   The arrows in t
ec30: 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65  he diagram above
ec40: 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53   represent the S
ec50: 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69  elect.pPrior poi
ec60: 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74  nter..** So if t
ec70: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
ec80: 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75  alled with p equ
ec90: 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65  al to the t3 que
eca0: 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69  ry, then.** pPri
ecb0: 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74  or will be the t
ecc0: 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20  2 query.  p->op 
ecd0: 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e  will be TK_UNION
ece0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
ecf0: 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74  *.** Notice that
ed00: 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
ed10: 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65  way SQLite parse
ed20: 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  s compound SELEC
ed30: 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  Ts, the.** indiv
ed40: 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c  idual selects al
ed50: 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20  ways group from 
ed60: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a  left to right..*
ed70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
ed80: 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  tiSelect(.  Pars
ed90: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
eda0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
edb0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
edc0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
edd0: 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
ede0: 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
edf0: 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
ee00: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
ee10: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
ee20: 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
ee30: 75 6c 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ults */.  char *
ee40: 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  aff             
ee50: 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20 53  /* If eDest is S
ee60: 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66  RT_Union, the af
ee70: 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f  finity string */
ee80: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
ee90: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53  QLITE_OK;   /* S
eea0: 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d  uccess code from
eeb0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
eec0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
eed0: 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
eee0: 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
eef0: 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
ef00: 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
ef10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ef20: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
ef30: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
ef40: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
ef50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ef60: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
ef70: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
ef80: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
ef90: 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
efa0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
efb0: 6f 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20 61 53  on p */.  int aS
efc0: 65 74 50 32 5b 32 5d 3b 20 20 20 20 20 20 20 20  etP2[2];        
efd0: 2f 2a 20 53 65 74 20 50 32 20 76 61 6c 75 65 20  /* Set P2 value 
efe0: 6f 66 20 74 68 65 73 65 20 6f 70 20 74 6f 20 6e  of these op to n
eff0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
f000: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 74 50 32   */.  int nSetP2
f010: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
f020: 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 69  umber of slots i
f030: 6e 20 61 53 65 74 50 32 5b 5d 20 75 73 65 64 20  n aSetP2[] used 
f040: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
f050: 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c  dest;      /* Al
f060: 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64  ternative data d
f070: 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 0a 20  estination */.. 
f080: 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a   dest = *pDest;.
f090: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
f0a0: 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
f0b0: 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c  R BY or LIMIT cl
f0c0: 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45  ause on prior SE
f0d0: 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a  LECTs.  Only.  *
f0e0: 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68  * the last (righ
f0f0: 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69  t-most) SELECT i
f100: 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79  n the series may
f110: 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
f120: 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f  Y or LIMIT..  */
f130: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
f140: 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
f150: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
f160: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
f170: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69  _end;.  }.  pPri
f180: 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
f190: 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
f1a0: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50  ->pRightmost!=pP
f1b0: 72 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74  rior );.  assert
f1c0: 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74  ( pPrior->pRight
f1d0: 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d  most==p->pRightm
f1e0: 6f 73 74 20 29 3b 0a 20 20 69 66 28 20 70 50 72  ost );.  if( pPr
f1f0: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ior->pOrderBy ){
f200: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
f210: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44  rMsg(pParse,"ORD
f220: 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f  ER BY clause sho
f230: 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
f240: 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
f250: 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
f260: 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
f270: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
f280: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
f290: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69  ;.  }.  if( pPri
f2a0: 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  or->pLimit ){.  
f2b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f2c0: 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20  g(pParse,"LIMIT 
f2d0: 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
f2e0: 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
f2f0: 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
f300: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
f310: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
f320: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
f330: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
f340: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
f350: 77 65 20 68 61 76 65 20 61 20 76 61 6c 69 64 20  we have a valid 
f360: 71 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49  query engine.  I
f370: 66 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20  f not, create a 
f380: 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  new one..  */.  
f390: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
f3a0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
f3b0: 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ( v==0 ){.    rc
f3c0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
f3d0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
f3e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74  .  }..  /* Creat
f3f0: 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  e the destinatio
f400: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
f410: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20  e if necessary. 
f420: 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65   */.  if( dest.e
f430: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
f440: 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
f450: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
f460: 20 20 20 61 73 73 65 72 74 28 20 6e 53 65 74 50     assert( nSetP
f470: 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29  2<sizeof(aSetP2)
f480: 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30  /sizeof(aSetP2[0
f490: 5d 29 20 29 3b 0a 20 20 20 20 61 53 65 74 50 32  ]) );.    aSetP2
f4a0: 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d 20 73 71 6c  [nSetP2++] = sql
f4b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f4c0: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
f4d0: 61 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d 2c 20  al, dest.iParm, 
f4e0: 30 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65  0);.    dest.eDe
f4f0: 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
f500: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
f510: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
f520: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53  left and right S
f530: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
f540: 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 64 65 72 42  ..  */.  pOrderB
f550: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
f560: 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
f570: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
f580: 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ALL: {.      if(
f590: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
f5a0: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
f5b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 73   = 0;.        as
f5c0: 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
f5d0: 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 20  Limit );.       
f5e0: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
f5f0: 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
f600: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66       pPrior->pOf
f610: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
f620: 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
f630: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
f640: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
f650: 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  est, 0, 0, 0, af
f660: 66 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  f);.        p->p
f670: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
f680: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
f690: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  0;.        if( r
f6a0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
f6b0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
f6c0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
f6d0: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
f6e0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  r = 0;.        p
f6f0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f  ->iLimit = pPrio
f700: 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r->iLimit;.     
f710: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
f720: 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b  pPrior->iOffset;
f730: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
f740: 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20  iLimit>=0 ){.   
f750: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
f760: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
f770: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
f780: 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >iLimit);.      
f790: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
f7a0: 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20  (v, "Jump ahead 
f7b0: 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64  if LIMIT reached
f7c0: 22 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  "));.        }. 
f7d0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
f7e0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
f7f0: 2c 20 70 2c 20 26 64 65 73 74 2c 20 30 2c 20 30  , p, &dest, 0, 0
f800: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
f810: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
f820: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69  Prior;.        i
f830: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
f840: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
f850: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
f860: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
f870: 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  addr ){.        
f880: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
f890: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
f8a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f8b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
f8c0: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e  .      /* For UN
f8d0: 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45  ION ALL ... ORDE
f8e0: 52 20 42 59 20 66 61 6c 6c 20 74 68 72 6f 75 67  R BY fall throug
f8f0: 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61  h to the next ca
f900: 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  se */.    }.    
f910: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a  case TK_EXCEPT:.
f920: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
f930: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75  N: {.      int u
f940: 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43  nionTab;    /* C
f950: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
f960: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
f970: 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ble holding resu
f980: 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lt */.      int 
f990: 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  op = 0;      /* 
f9a0: 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20  One of the SRT_ 
f9b0: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70  operations to ap
f9c0: 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20  ply to self */. 
f9d0: 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70       int priorOp
f9e0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54  ;     /* The SRT
f9f0: 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61  _ operation to a
fa00: 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65  pply to prior se
fa10: 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45  lects */.      E
fa20: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
fa30: 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20  ffset; /* Saved 
fa40: 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69  values of p->nLi
fa50: 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73  mit and p->nOffs
fa60: 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  et */.      int 
fa70: 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65  addr;.      Sele
fa80: 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74  ctDest uniondest
fa90: 3b 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70  ;..      priorOp
faa0: 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c   = p->op==TK_ALL
fab0: 20 3f 20 53 52 54 5f 54 61 62 6c 65 20 3a 20 53   ? SRT_Table : S
fac0: 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
fad0: 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
fae0: 70 72 69 6f 72 4f 70 20 26 26 20 70 4f 72 64 65  priorOp && pOrde
faf0: 72 42 79 3d 3d 30 20 26 26 20 21 70 2d 3e 70 4c  rBy==0 && !p->pL
fb00: 69 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f 66 66  imit && !p->pOff
fb10: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  set ){.        /
fb20: 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
fb30: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
fb40: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
fb50: 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
fb60: 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a        ** right..
fb70: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
fb80: 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65     unionTab = de
fb90: 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20 20  st.iParm;.      
fba0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
fbb0: 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  * We will need t
fbc0: 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e  o create our own
fbd0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
fbe0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20   to hold the.   
fbf0: 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
fc00: 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
fc10: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
fc20: 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72   unionTab = pPar
fc30: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
fc40: 20 20 20 20 69 66 28 20 70 72 6f 63 65 73 73 43      if( processC
fc50: 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 70  ompoundOrderBy(p
fc60: 50 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54  Parse, p, unionT
fc70: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
fc80: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
fc90: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
fca0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
fcb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72    }.        addr
fcc0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
fcd0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
fce0: 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54  phemeral, unionT
fcf0: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
fd00: 69 66 28 20 70 72 69 6f 72 4f 70 3d 3d 53 52 54  if( priorOp==SRT
fd10: 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  _Table ){.      
fd20: 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 65 74      assert( nSet
fd30: 50 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32  P2<sizeof(aSetP2
fd40: 29 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b  )/sizeof(aSetP2[
fd50: 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  0]) );.         
fd60: 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b   aSetP2[nSetP2++
fd70: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
fd80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
fd90: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
fda0: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
fdb0: 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20   -1 );.         
fdc0: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
fdd0: 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
fde0: 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d        p->pRightm
fdf0: 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20  ost->usesEphm = 
fe00: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
fe10: 20 20 20 20 20 63 72 65 61 74 65 53 6f 72 74 69       createSorti
fe20: 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  ngIndex(pParse, 
fe30: 70 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p, pOrderBy);.  
fe40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
fe50: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
fe60: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
fe70: 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
fe80: 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c  tements to our l
fe90: 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  eft.      */.   
fea0: 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
feb0: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a  or->pOrderBy );.
fec0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
fed0: 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69  ectDestInit(&uni
fee0: 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c  ondest, priorOp,
fef0: 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20   unionTab);.    
ff00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
ff10: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
ff20: 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 2c  ior, &uniondest,
ff30: 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
ff40: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
ff50: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
ff60: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
ff70: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
ff80: 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
ff90: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
ffa0: 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  nt.      */.    
ffb0: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
ffc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  ){.         case
ffd0: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20   TK_EXCEPT:  op 
ffe0: 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20  = SRT_Except;   
fff0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
10000 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20  case TK_UNION:  
10010 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b   op = SRT_Union;
10020 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
10030 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
10040 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61       op = SRT_Ta
10050 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  ble;    break;. 
10060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
10070 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
10080 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
10090 30 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 73 61  0;.      p->disa
100a0 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 70 4f  llowOrderBy = pO
100b0 72 64 65 72 42 79 21 3d 30 3b 0a 20 20 20 20 20  rderBy!=0;.     
100c0 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
100d0 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
100e0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
100f0 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
10100 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
10110 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
10120 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73    uniondest.eDes
10130 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 72 63  t = op;.      rc
10140 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
10150 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69  (pParse, p, &uni
10160 6f 6e 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c  ondest, 0, 0, 0,
10170 20 61 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20   aff);.      /* 
10180 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  Query flattening
10190 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
101a0 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c  t() might refill
101b0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20   p->pOrderBy..  
101c0 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74      ** Be sure t
101d0 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64  o delete p->pOrd
101e0 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c  erBy, therefore,
101f0 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f   to avoid a memo
10200 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20  ry leak. */.    
10210 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
10220 74 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65  tDelete(p->pOrde
10230 72 42 79 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rBy);.      p->p
10240 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
10250 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
10260 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
10270 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
10280 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29  elete(p->pLimit)
10290 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
102a0 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
102b0 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
102c0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
102d0 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >iLimit = -1;.  
102e0 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
102f0 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 72   -1;.      if( r
10300 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
10310 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
10320 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20  nd;.      }...  
10330 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
10340 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  he data in the t
10350 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
10360 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
10370 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73  m.      ** it is
10380 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74   that we current
10390 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ly need..      *
103a0 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66  /      .      if
103b0 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  ( dest.eDest!=pr
103c0 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61  iorOp || unionTa
103d0 62 21 3d 64 65 73 74 2e 69 50 61 72 6d 20 29 7b  b!=dest.iParm ){
103e0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
103f0 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61  nt, iBreak, iSta
10400 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
10410 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
10420 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65 73  .        if( des
10430 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  t.eDest==SRT_Cal
10440 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lback ){.       
10450 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
10460 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  t = p;.         
10470 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
10480 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
10490 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
104a0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65  ;.          gene
104b0 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
104c0 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73  pParse, 0, pFirs
104d0 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  t->pEList);.    
104e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42      }.        iB
104f0 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
10500 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
10510 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20          iCont = 
10520 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
10530 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
10540 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
10550 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
10560 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
10570 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10580 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
10590 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72  d, unionTab, iBr
105a0 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53  eak);.        iS
105b0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
105c0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
105d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
105e0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
105f0 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
10600 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70  ist, unionTab, p
10610 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
10620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
10640 72 64 65 72 42 79 2c 20 2d 31 2c 20 26 64 65 73  rderBy, -1, &des
10650 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
10660 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
10670 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
10680 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
10690 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
106a0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
106b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
106c0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
106d0 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
106e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
106f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10700 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Next, unionTab, 
10710 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20  iStart);.       
10720 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
10730 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
10740 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
10750 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10760 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f  , OP_Close, unio
10770 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
10780 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
10790 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
107a0 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20  _INTERSECT: {.  
107b0 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
107c0 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
107d0 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
107e0 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  art;.      Expr 
107f0 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
10800 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
10810 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
10820 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
10830 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54  t;..      /* INT
10840 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72  ERSECT is differ
10850 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ent from the oth
10860 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71  ers since it req
10870 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74  uires.      ** t
10880 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wo temporary tab
10890 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68  les.  Hence it h
108a0 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e  as its own case.
108b0 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a    Begin.      **
108c0 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74   by allocating t
108d0 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c  he tables we wil
108e0 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  l need..      */
108f0 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50  .      tab1 = pP
10900 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
10910 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73      tab2 = pPars
10920 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
10930 20 69 66 28 20 70 72 6f 63 65 73 73 43 6f 6d 70   if( processComp
10940 6f 75 6e 64 4f 72 64 65 72 42 79 28 70 50 61 72  oundOrderBy(pPar
10950 73 65 2c 20 70 2c 20 74 61 62 31 29 20 29 7b 0a  se, p, tab1) ){.
10960 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
10970 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
10980 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
10990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 72 65       }.      cre
109a0 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28  ateSortingIndex(
109b0 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 72 64 65  pParse, p, pOrde
109c0 72 42 79 29 3b 0a 0a 20 20 20 20 20 20 61 64 64  rBy);..      add
109d0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
109e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
109f0 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c  Ephemeral, tab1,
10a00 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
10a10 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
10a20 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
10a30 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
10a40 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
10a50 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d        p->pRightm
10a60 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20  ost->usesEphm = 
10a70 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
10a80 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20   p->pEList );.. 
10a90 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
10aa0 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20   SELECTs to our 
10ab0 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72  left into tempor
10ac0 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22  ary table "tab1"
10ad0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10ae0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
10af0 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63  stInit(&intersec
10b00 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e  tdest, SRT_Union
10b10 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 72  , tab1);.      r
10b20 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
10b30 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
10b40 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
10b50 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b  , 0, 0, 0, aff);
10b60 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
10b70 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
10b80 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
10b90 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
10ba0 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
10bb0 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
10bc0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
10bd0 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
10be0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
10bf0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10c00 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
10c10 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  l, tab2, 0);.   
10c20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
10c30 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
10c40 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
10c50 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
10c60 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
10c70 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
10c80 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
10c90 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
10ca0 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
10cb0 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
10cc0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
10cd0 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
10ce0 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73      intersectdes
10cf0 74 2e 69 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a  t.iParm = tab2;.
10d00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10d10 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
10d20 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65   p, &intersectde
10d30 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  st, 0, 0, 0, aff
10d40 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
10d50 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
10d60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
10d70 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b  lete(p->pLimit);
10d80 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
10d90 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
10da0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
10db0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28  ffset;.      if(
10dc0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
10dd0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
10de0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
10df0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
10e00 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68   code to take th
10e10 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  e intersection o
10e20 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72  f the two tempor
10e30 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  ary.      ** tab
10e40 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  les..      */.  
10e50 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
10e60 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69  EList );.      i
10e70 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
10e80 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
10e90 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
10ea0 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  First = p;.     
10eb0 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
10ec0 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
10ed0 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
10ee0 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65  or;.        gene
10ef0 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
10f00 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73  pParse, 0, pFirs
10f10 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  t->pEList);.    
10f20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b    }.      iBreak
10f30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
10f40 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
10f50 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
10f60 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
10f70 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65  );.      compute
10f80 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
10f90 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b  Parse, p, iBreak
10fa0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10fb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10fc0 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
10fd0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 69 53  Break);.      iS
10fe0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
10ff0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
11000 6f 77 4b 65 79 2c 20 74 61 62 31 29 3b 0a 20 20  owKey, tab1);.  
11010 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11020 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 46  ddOp2(v, OP_NotF
11030 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e  ound, tab2, iCon
11040 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
11050 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
11060 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
11070 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45  ist, tab1, p->pE
11080 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
11090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110a0 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72            pOrder
110b0 42 79 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69  By, -1, &dest, i
110c0 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29  Cont, iBreak, 0)
110d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
110e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  {.        rc = 1
110f0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
11100 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
11110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
11120 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
11130 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
11140 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11150 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11160 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61  Next, tab1, iSta
11170 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
11180 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
11190 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
111a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
111b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
111c0 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
111d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
111e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
111f0 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  e, tab1, 0);.   
11200 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11210 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
11220 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
11230 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
11240 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
11250 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
11260 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
11270 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
11280 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
11290 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
112a0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28  >pEList );.  if(
112b0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
112c0 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r!=pPrior->pELis
112d0 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
112e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
112f0 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
11300 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
11310 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
11320 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76      " do not hav
11330 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
11340 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
11350 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  mns", selectOpNa
11360 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
11370 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
11380 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
11390 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  d;.  }..  /* Set
113a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
113b0 6f 6c 75 6d 6e 73 20 69 6e 20 74 65 6d 70 6f 72  olumns in tempor
113c0 61 72 79 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a  ary tables.  */.
113d0 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69    nCol = p->pELi
113e0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 77 68 69  st->nExpr;.  whi
113f0 6c 65 28 20 6e 53 65 74 50 32 20 29 7b 0a 20 20  le( nSetP2 ){.  
11400 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
11410 6e 67 65 50 32 28 76 2c 20 61 53 65 74 50 32 5b  ngeP2(v, aSetP2[
11420 2d 2d 6e 53 65 74 50 32 5d 2c 20 6e 43 6f 6c 29  --nSetP2], nCol)
11430 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
11440 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ute collating se
11450 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20  quences used by 
11460 65 69 74 68 65 72 20 74 68 65 20 4f 52 44 45 52  either the ORDER
11470 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 20 20   BY clause or.  
11480 2a 2a 20 62 79 20 61 6e 79 20 74 65 6d 70 6f 72  ** by any tempor
11490 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65  ary tables neede
114a0 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
114b0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
114c0 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20  ct..  ** Attach 
114d0 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
114e0 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d  cture to all tem
114f0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
11500 49 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20  Invoke the.  ** 
11510 4f 52 44 45 52 20 42 59 20 70 72 6f 63 65 73 73  ORDER BY process
11520 69 6e 67 20 69 66 20 74 68 65 72 65 20 69 73 20  ing if there is 
11530 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
11540 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  se..  **.  ** Th
11550 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75  is section is ru
11560 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d  n by the right-m
11570 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
11580 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20  ment only..  ** 
11590 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
115a0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c  s to the left al
115b0 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70  ways skip this p
115c0 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d  art.  The right-
115d0 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54  most.  ** SELECT
115e0 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70   might also skip
115f0 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74   this part if it
11600 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59   has no ORDER BY
11610 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a   clause and.  **
11620 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20   no temp tables 
11630 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20  are required..  
11640 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
11650 79 20 7c 7c 20 70 2d 3e 75 73 65 73 45 70 68 6d  y || p->usesEphm
11660 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20   ){.    int i;  
11670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11680 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
11690 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79  unter */.    Key
116a0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
116b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
116c0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
116d0 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
116e0 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63  set */.    Selec
116f0 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  t *pLoop;       
11700 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
11710 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
11720 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11730 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65  s */.    int nKe
11740 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  yCol;           
11750 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11760 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70   of entries in p
11770 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  KeyInfo->aCol[] 
11780 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  */.    CollSeq *
11790 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20  *apColl;        
117a0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
117b0 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79  ing through pKey
117c0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f  Info->aColl[] */
117d0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
117e0 43 6f 70 79 3b 20 20 20 20 20 20 20 20 20 20 20  Copy;           
117f0 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
11800 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
11810 5d 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  ] */..    assert
11820 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ( p->pRightmost=
11830 3d 70 20 29 3b 0a 20 20 20 20 6e 4b 65 79 43 6f  =p );.    nKeyCo
11840 6c 20 3d 20 6e 43 6f 6c 20 2b 20 28 70 4f 72 64  l = nCol + (pOrd
11850 65 72 42 79 20 3f 20 70 4f 72 64 65 72 42 79 2d  erBy ? pOrderBy-
11860 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20  >nExpr : 0);.   
11870 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
11880 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
11890 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20  pParse->db,.    
118a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118b0 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49     sizeof(*pKeyI
118c0 6e 66 6f 29 2b 6e 4b 65 79 43 6f 6c 2a 28 73 69  nfo)+nKeyCol*(si
118d0 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b  zeof(CollSeq*) +
118e0 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70   1));.    if( !p
118f0 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
11900 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
11910 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  EM;.      goto m
11920 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
11930 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79  .    }..    pKey
11940 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  Info->enc = ENC(
11950 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20  pParse->db);.   
11960 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
11970 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66  d = nCol;..    f
11980 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70  or(i=0, apColl=p
11990 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20  KeyInfo->aColl; 
119a0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43  i<nCol; i++, apC
119b0 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61  oll++){.      *a
119c0 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
119d0 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
119e0 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
119f0 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29  if( 0==*apColl )
11a00 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c  {.        *apCol
11a10 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
11a20 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
11a30 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
11a40 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
11a50 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
11a60 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f  Prior){.      fo
11a70 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
11a80 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
11a90 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  dr = pLoop->addr
11aa0 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20  OpenEphm[i];.   
11ab0 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20       if( addr<0 
11ac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
11ad0 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  If [0] is unused
11ae0 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73   then [1] is als
11af0 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65  o unused.  So we
11b00 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a   can.          *
11b10 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20  * always safely 
11b20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73  abort as soon as
11b30 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65   the first unuse
11b40 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20  d slot is found 
11b50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
11b60 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  ert( pLoop->addr
11b70 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b  OpenEphm[1]<0 );
11b80 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
11b90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11ba0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
11bb0 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
11bc0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
11bd0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
11be0 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP4(v, addr, (ch
11bf0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
11c00 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
11c10 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70     pLoop->addrOp
11c20 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a  enEphm[i] = -1;.
11c30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
11c40 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
11c50 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
11c60 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
11c70 4f 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79  OTerm = pOrderBy
11c80 2d 3e 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ->a;.      int n
11c90 4f 72 64 65 72 42 79 45 78 70 72 20 3d 20 70 4f  OrderByExpr = pO
11ca0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
11cb0 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
11cc0 20 20 20 20 20 75 38 20 2a 70 53 6f 72 74 4f 72       u8 *pSortOr
11cd0 64 65 72 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52  der;..      /* R
11ce0 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 70 4b  euse the same pK
11cf0 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 4f  eyInfo for the O
11d00 52 44 45 52 20 42 59 20 61 73 20 77 61 73 20 75  RDER BY as was u
11d10 73 65 64 20 61 62 6f 76 65 20 66 6f 72 0a 20 20  sed above for.  
11d20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f      ** the compo
11d30 75 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65  und select state
11d40 6d 65 6e 74 73 2e 20 20 45 78 63 65 70 74 20 77  ments.  Except w
11d50 65 20 68 61 76 65 20 74 6f 20 63 68 61 6e 67 65  e have to change
11d60 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a   out the.      *
11d70 2a 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  * pKeyInfo->aCol
11d80 6c 5b 5d 20 76 61 6c 75 65 73 2e 20 20 53 6f 6d  l[] values.  Som
11d90 65 20 6f 66 20 74 68 65 20 61 43 6f 6c 6c 5b 5d  e of the aColl[]
11da0 20 76 61 6c 75 65 73 20 77 69 6c 6c 20 62 65 0a   values will be.
11db0 20 20 20 20 20 20 2a 2a 20 72 65 75 73 65 64 20        ** reused 
11dc0 77 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  when constructin
11dd0 67 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 20 66  g the pKeyInfo f
11de0 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 2c  or the ORDER BY,
11df0 20 73 6f 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   so make.      *
11e00 2a 20 61 20 63 6f 70 79 2e 20 20 53 75 66 66 69  * a copy.  Suffi
11e10 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 68  cient space to h
11e20 6f 6c 64 20 62 6f 74 68 20 74 68 65 20 6e 43 6f  old both the nCo
11e30 6c 20 65 6e 74 72 69 65 73 20 66 6f 72 0a 20 20  l entries for.  
11e40 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f      ** the compo
11e50 75 6e 64 20 73 65 6c 65 63 74 20 61 6e 64 20 74  und select and t
11e60 68 65 20 6e 4f 72 64 65 72 62 79 45 78 70 72 20  he nOrderbyExpr 
11e70 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
11e80 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a  ORDER BY.      *
11e90 2a 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  * was allocated 
11ea0 61 62 6f 76 65 2e 20 20 42 75 74 20 77 65 20 6e  above.  But we n
11eb0 65 65 64 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  eed to move the 
11ec0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 0a  compound select.
11ed0 20 20 20 20 20 20 2a 2a 20 65 6e 74 72 69 65 73        ** entries
11ee0 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 20   out of the way 
11ef0 62 65 66 6f 72 65 20 63 6f 6e 73 74 72 75 63 74  before construct
11f00 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
11f10 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
11f20 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 6f 6d 70  ** Move the comp
11f30 6f 75 6e 64 20 73 65 6c 65 63 74 20 65 6e 74 72  ound select entr
11f40 69 65 73 20 69 6e 74 6f 20 61 43 6f 70 79 5b 5d  ies into aCopy[]
11f50 20 77 68 65 72 65 20 74 68 65 79 20 63 61 6e 20   where they can 
11f60 62 65 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 65  be.      ** acce
11f70 73 73 65 64 20 61 6e 64 20 72 65 75 73 65 64 20  ssed and reused 
11f80 77 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  when constructin
11f90 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65  g the ORDER BY e
11fa0 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 2a 2a  ntries..      **
11fb0 20 42 65 63 61 75 73 65 20 6e 43 6f 6c 20 6d 69   Because nCol mi
11fc0 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ght be greater t
11fd0 68 61 6e 20 6f 72 20 6c 65 73 73 20 74 68 61 6e  han or less than
11fe0 20 6e 4f 72 64 65 72 42 79 45 78 70 72 0a 20 20   nOrderByExpr.  
11ff0 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74      ** we have t
12000 6f 20 75 73 65 20 6d 65 6d 6d 6f 76 65 28 29 20  o use memmove() 
12010 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 63  when doing the c
12020 6f 70 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  opy..      */.  
12030 20 20 20 20 61 43 6f 70 79 20 3d 20 26 70 4b 65      aCopy = &pKe
12040 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72  yInfo->aColl[nOr
12050 64 65 72 42 79 45 78 70 72 5d 3b 0a 20 20 20 20  derByExpr];.    
12060 20 20 70 53 6f 72 74 4f 72 64 65 72 20 3d 20 70    pSortOrder = p
12070 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
12080 64 65 72 20 3d 20 28 75 38 2a 29 26 61 43 6f 70  der = (u8*)&aCop
12090 79 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 6d  y[nCol];.      m
120a0 65 6d 6d 6f 76 65 28 61 43 6f 70 79 2c 20 70 4b  emmove(aCopy, pK
120b0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 2c 20 6e  eyInfo->aColl, n
120c0 43 6f 6c 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  Col*sizeof(CollS
120d0 65 71 2a 29 29 3b 0a 0a 20 20 20 20 20 20 61 70  eq*));..      ap
120e0 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
120f0 3e 61 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 66 6f  >aColl;.      fo
12100 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
12110 79 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4f 54 65  yExpr; i++, pOTe
12120 72 6d 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 2c 20  rm++, apColl++, 
12130 70 53 6f 72 74 4f 72 64 65 72 2b 2b 29 7b 0a 20  pSortOrder++){. 
12140 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
12150 70 72 20 3d 20 70 4f 54 65 72 6d 2d 3e 70 45 78  pr = pOTerm->pEx
12160 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
12170 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
12180 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 29  EP_ExpCollate) )
12190 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
121a0 72 74 28 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  rt( pExpr->pColl
121b0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
121c0 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72   *apColl = pExpr
121d0 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ->pColl;.       
121e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
121f0 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 61 43 6f 70    *apColl = aCop
12200 79 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  y[pExpr->iColumn
12210 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
12220 20 20 20 20 20 2a 70 53 6f 72 74 4f 72 64 65 72       *pSortOrder
12230 20 3d 20 70 4f 54 65 72 6d 2d 3e 73 6f 72 74 4f   = pOTerm->sortO
12240 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rder;.      }.  
12250 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
12260 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a  Rightmost==p );.
12270 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
12280 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
12290 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64  >=0 );.      add
122a0 72 20 3d 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  r = p->addrOpenE
122b0 70 68 6d 5b 32 5d 3b 0a 20 20 20 20 20 20 73 71  phm[2];.      sq
122c0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
122d0 32 28 76 2c 20 61 64 64 72 2c 20 70 2d 3e 70 4f  2(v, addr, p->pO
122e0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 29  rderBy->nExpr+2)
122f0 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
12300 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 4f 72 64 65  ->nField = nOrde
12310 72 42 79 45 78 70 72 3b 0a 20 20 20 20 20 20 73  rByExpr;.      s
12320 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
12330 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61  P4(v, addr, (cha
12340 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
12350 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
12360 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
12370 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 65 6e 65   = 0;.      gene
12380 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
12390 72 73 65 2c 20 70 2c 20 76 2c 20 70 2d 3e 70 45  rse, p, v, p->pE
123a0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 26 64 65  List->nExpr, &de
123b0 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  st);.    }..    
123c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65  sqlite3_free(pKe
123d0 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c  yInfo);.  }..mul
123e0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  ti_select_end:. 
123f0 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 64   pDest->iMem = d
12400 65 73 74 2e 69 4d 65 6d 3b 0a 20 20 72 65 74 75  est.iMem;.  retu
12410 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
12420 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
12430 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
12440 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
12450 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 20 46  E_OMIT_VIEW./* F
12460 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69  orward Declarati
12470 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons */.static vo
12480 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
12490 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c  (sqlite3*, ExprL
124a0 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ist*, int, ExprL
124b0 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ist*);.static vo
124c0 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73  id substSelect(s
124d0 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20  qlite3*, Select 
124e0 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
124f0 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e   *);../*.** Scan
12500 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70   through the exp
12510 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20  ression pExpr.  
12520 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65  Replace every re
12530 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20  ference to.** a 
12540 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
12550 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69  number iTable wi
12560 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
12570 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65   iColumn-th.** e
12580 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20  ntry in pEList. 
12590 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65   (But leave refe
125a0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f  rences to the RO
125b0 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75  WID column .** u
125c0 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a  nchanged.).**.**
125d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
125e0 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61   part of the fla
125f0 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72  ttening procedur
12600 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a  e.  A subquery.*
12610 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73  * whose result s
12620 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
12630 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20   pEList appears 
12640 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  as entry in the.
12650 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ** FROM clause o
12660 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20  f a SELECT such 
12670 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75  that the VDBE cu
12680 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
12690 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c   that.** FORM cl
126a0 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54  ause entry is iT
126b0 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
126c0 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63  ine make the nec
126d0 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67  essary .** chang
126e0 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74  es to pExpr so t
126f0 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69  hat it refers di
12700 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f  rectly to the so
12710 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66  urce table.** of
12720 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61   the subquery ra
12730 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20  ther the result 
12740 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  set of the subqu
12750 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ery..*/.static v
12760 6f 69 64 20 73 75 62 73 74 45 78 70 72 28 0a 20  oid substExpr(. 
12770 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
12780 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
12790 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20  alloc errors to 
127a0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
127b0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
127c0 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  ,        /* Expr
127d0 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69   in which substi
127e0 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f  tution occurs */
127f0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
12800 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
12810 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
12820 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
12830 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75  *pEList    /* Su
12840 62 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73  bstitute express
12850 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ions */.){.  if(
12860 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
12870 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
12880 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
12890 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
128a0 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  =iTable ){.    i
128b0 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
128c0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  n<0 ){.      pEx
128d0 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
128e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
128f0 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20     Expr *pNew;. 
12900 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
12910 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d  ist!=0 && pExpr-
12920 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d  >iColumn<pEList-
12930 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
12940 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
12950 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
12960 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70  ->pRight==0 && p
12970 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
12980 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70  ;.      pNew = p
12990 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e  EList->a[pExpr->
129a0 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a  iColumn].pExpr;.
129b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
129c0 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ew!=0 );.      p
129d0 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d  Expr->op = pNew-
129e0 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72  >op;.      asser
129f0 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
12a00 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
12a10 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r->pLeft = sqlit
12a20 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e  e3ExprDup(db, pN
12a30 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  ew->pLeft);.    
12a40 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
12a50 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
12a60 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
12a70 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
12a80 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 52 69  up(db, pNew->pRi
12a90 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ght);.      asse
12aa0 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  rt( pExpr->pList
12ab0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
12ac0 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69  pr->pList = sqli
12ad0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
12ae0 62 2c 20 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b  b, pNew->pList);
12af0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
12b00 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61  able = pNew->iTa
12b10 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ble;.      pExpr
12b20 2d 3e 70 54 61 62 20 3d 20 70 4e 65 77 2d 3e 70  ->pTab = pNew->p
12b30 54 61 62 3b 0a 20 20 20 20 20 20 70 45 78 70 72  Tab;.      pExpr
12b40 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77  ->iColumn = pNew
12b50 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
12b60 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70   pExpr->iAgg = p
12b70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20  New->iAgg;.     
12b80 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
12b90 79 28 64 62 2c 20 26 70 45 78 70 72 2d 3e 74 6f  y(db, &pExpr->to
12ba0 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65  ken, &pNew->toke
12bb0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
12bc0 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26  3TokenCopy(db, &
12bd0 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e  pExpr->span, &pN
12be0 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20  ew->span);.     
12bf0 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
12c00 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
12c10 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 53 65  up(db, pNew->pSe
12c20 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 70 45 78  lect);.      pEx
12c30 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77  pr->flags = pNew
12c40 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  ->flags;.    }. 
12c50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73   }else{.    subs
12c60 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
12c70 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20  >pLeft, iTable, 
12c80 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
12c90 73 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72  stExpr(db, pExpr
12ca0 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65  ->pRight, iTable
12cb0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
12cc0 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
12cd0 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69  Expr->pSelect, i
12ce0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
12cf0 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
12d00 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 69  t(db, pExpr->pLi
12d10 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
12d20 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  st);.  }.}.stati
12d30 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
12d40 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20  List(.  sqlite3 
12d50 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
12d60 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
12d70 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45  rors here */.  E
12d80 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
12d90 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
12da0 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
12db0 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
12dc0 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  utes */.  int iT
12dd0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
12de0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
12df0 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
12e00 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
12e10 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
12e20 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
12e30 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
12e40 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
12e50 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
12e60 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
12e70 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  {.    substExpr(
12e80 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
12e90 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70  pExpr, iTable, p
12ea0 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
12eb0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
12ec0 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33  elect(.  sqlite3
12ed0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a   *db,         /*
12ee0 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65   Report malloc e
12ef0 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20  rrors here */.  
12f00 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
12f10 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
12f20 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63  tatement in whic
12f30 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
12f40 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  tutions */.  int
12f50 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
12f60 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
12f70 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45   replaced */.  E
12f80 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
12f90 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
12fa0 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
12fb0 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
12fc0 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
12fd0 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  t(db, p->pEList,
12fe0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
12ff0 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
13000 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42  t(db, p->pGroupB
13010 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
13020 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
13030 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ist(db, p->pOrde
13040 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  rBy, iTable, pEL
13050 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
13060 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  r(db, p->pHaving
13070 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
13080 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 64  );.  substExpr(d
13090 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54  b, p->pWhere, iT
130a0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
130b0 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
130c0 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61 62   p->pPrior, iTab
130d0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23  le, pEList);.}.#
130e0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
130f0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
13100 45 57 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  EW) */..#ifndef 
13110 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
13120 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
13130 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
13140 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
13150 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  es in order to s
13160 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f  peed.** executio
13170 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 31  n.  It returns 1
13180 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61   if it makes cha
13190 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f  nges and 0 if no
131a0 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f   flattening.** o
131b0 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
131c0 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
131d0 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
131e0 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
131f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
13200 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
13210 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
13220 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
13230 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
13240 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
13250 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
13260 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
13270 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
13280 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
13290 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
132a0 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
132b0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
132c0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
132d0 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
132e0 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
132f0 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
13300 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
13310 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
13320 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
13330 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
13340 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
13350 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
13360 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
13370 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
13380 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
13390 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
133a0 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
133b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
133c0 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
133d0 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
133e0 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
133f0 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
13400 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
13410 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
13420 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
13430 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
13440 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
13450 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
13460 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
13470 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20  ification gives 
13480 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a  the same result.
13490 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20  ** but only has 
134a0 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61  to scan the data
134b0 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61   once.  And beca
134c0 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68  use indices migh
134d0 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74  t .** exist on t
134e0 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63  he table t1, a c
134f0 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20  omplete scan of 
13500 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62  the data might b
13510 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a  e.** avoided..**
13520 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69  .** Flattening i
13530 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64  s only attempted
13540 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
13550 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
13560 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  e:.**.**   (1)  
13570 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
13580 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
13590 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
135a0 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
135b0 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75  **   (2)  The su
135c0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e  bquery is not an
135d0 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68   aggregate or th
135e0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
135f0 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
13600 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75  **   (3)  The su
13610 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
13620 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
13630 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20  of a left outer 
13640 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20  join, or.**     
13650 20 20 20 74 68 65 20 73 75 62 71 75 65 72 79 20     the subquery 
13660 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20  is not itself a 
13670 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23  join.  (Ticket #
13680 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  306).**.**   (4)
13690 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
136a0 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f  s not DISTINCT o
136b0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
136c0 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
136d0 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68  .**.**   (5)  Th
136e0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
136f0 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68  t DISTINCT or th
13700 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
13710 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
13720 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
13730 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68  .**.**   (6)  Th
13740 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
13750 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
13760 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
13770 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
13780 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
13790 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68  .**.**   (7)  Th
137a0 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61  e subquery has a
137b0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
137c0 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73  .**   (8)  The s
137d0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
137e0 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
137f0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
13800 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
13810 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75  **   (9)  The su
13820 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
13830 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
13840 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
13850 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
13860 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
13870 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65  **.**  (10)  The
13880 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
13890 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
138a0 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
138b0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  uery does not.**
138c0 20 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49          use LIMI
138d0 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20  T..**.**  (11)  
138e0 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
138f0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
13900 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76   do not both hav
13910 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
13920 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20  es..**.**  (12) 
13930 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
13940 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 74   not the right t
13950 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  erm of a LEFT OU
13960 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a  TER JOIN or the.
13970 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65  **        subque
13980 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20  ry has no WHERE 
13990 63 6c 61 75 73 65 2e 20 20 28 61 64 64 65 64 20  clause.  (added 
139a0 62 79 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a  by ticket #350).
139b0 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65  **.**  (13)  The
139c0 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75   subquery and ou
139d0 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
139e0 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 0a   both use LIMIT.
139f0 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65  **.**  (14)  The
13a00 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
13a10 6f 74 20 75 73 65 20 4f 46 46 53 45 54 0a 2a 2a  ot use OFFSET.**
13a20 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f  .**  (15)  The o
13a30 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
13a40 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  t part of a comp
13a50 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74  ound select or t
13a60 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  he.**        sub
13a70 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68  query does not h
13a80 61 76 65 20 62 6f 74 68 20 61 6e 20 4f 52 44 45  ave both an ORDE
13a90 52 20 42 59 20 61 6e 64 20 61 20 4c 49 4d 49 54  R BY and a LIMIT
13aa0 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20   clause..**     
13ab0 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23     (See ticket #
13ac0 32 33 33 39 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  2339).**.** In t
13ad0 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
13ae0 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
13af0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
13b00 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
13b10 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
13b20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
13b30 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
13b40 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
13b50 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
13b60 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73  aggregates and s
13b70 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20  ubqueryIsAgg is 
13b80 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  true if the subq
13b90 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
13ba0 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66  ates..**.** If f
13bb0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74  lattening is not
13bc0 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
13bd0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
13be0 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20  -op and returns 
13bf0 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  0..** If flatten
13c00 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64  ing is attempted
13c10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
13c20 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41  turns 1..**.** A
13c30 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ll of the expres
13c40 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75  sion analysis mu
13c50 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68  st occur on both
13c60 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
13c70 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71   and.** the subq
13c80 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73  uery before this
13c90 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a   routine runs..*
13ca0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61  /.static int fla
13cb0 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20  ttenSubquery(.  
13cc0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
13cd0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
13ce0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
13cf0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
13d00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
13d10 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c  ent or outer SEL
13d20 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
13d30 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
13d40 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
13d50 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d   in p->pSrc->a[]
13d60 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75   of the inner su
13d70 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  bquery */.  int 
13d80 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20  isAgg,          
13d90 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65   /* True if oute
13da0 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67  r SELECT uses ag
13db0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
13dc0 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75  s */.  int subqu
13dd0 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54  eryIsAgg    /* T
13de0 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
13df0 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
13e00 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
13e10 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  ){.  Select *pSu
13e20 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b;       /* The 
13e30 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22  inner query or "
13e40 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53  subquery" */.  S
13e50 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
13e60 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
13e70 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
13e80 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  er query */.  Sr
13e90 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20  cList *pSubSrc; 
13ea0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
13eb0 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
13ec0 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uery */.  ExprLi
13ed0 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a  st *pList;    /*
13ee0 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
13ef0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
13f00 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ry */.  int iPar
13f10 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  ent;        /* V
13f20 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
13f30 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65  r of the pSub re
13f40 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61  sult set temp ta
13f50 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13f70 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
13f80 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
13f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fa0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
13fb0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
13fc0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
13fd0 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
13fe0 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
13ff0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
14000 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
14010 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
14020 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
14030 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30  .  */.  if( p==0
14040 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
14050 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
14060 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26   assert( pSrc &&
14070 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72   iFrom>=0 && iFr
14080 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  om<pSrc->nSrc );
14090 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70  .  pSubitem = &p
140a0 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20  Src->a[iFrom];. 
140b0 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d   pSub = pSubitem
140c0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ->pSelect;.  ass
140d0 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
140e0 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73    if( isAgg && s
140f0 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72  ubqueryIsAgg ) r
14100 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
14110 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
14120 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a  riction (1)  */.
14130 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
14140 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72  Agg && pSrc->nSr
14150 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  c>1 ) return 0; 
14160 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
14170 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a  riction (2)  */.
14180 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
14190 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
141a0 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f  ( pSubSrc );.  /
141b0 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69  * Prior to versi
141c0 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c  on 3.1.2, when L
141d0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
141e0 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65  had to be simple
141f0 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a   constants,.  **
14200 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65   not arbitrary e
14210 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65 20  xpresssions, we 
14220 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d  allowed some com
14230 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20  bining of LIMIT 
14240 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
14250 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75  because they cou
14260 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61  ld be computed a
14270 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
14280 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20   But when LIMIT 
14290 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
142a0 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79  became arbitrary
142b0 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
142c0 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20   were forced to 
142d0 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73  add restrictions
142e0 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28   (13).  ** and (
142f0 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53  14). */.  if( pS
14300 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
14310 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
14320 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
14330 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
14340 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (13) */.  if( pS
14350 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65  ub->pOffset ) re
14360 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
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 34 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d  (14) */.  if( p-
143a0 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26 20 70  >pRightmost && p
143b0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
143c0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
143d0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
143e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
14410 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f  triction (15) */
14420 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53  .  }.  if( pSubS
14430 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65  rc->nSrc==0 ) re
14440 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14460 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29   Restriction (7)
14470 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62    */.  if( (pSub
14480 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20  ->isDistinct || 
14490 70 53 75 62 2d 3e 70 4c 69 6d 69 74 29 20 0a 20  pSub->pLimit) . 
144a0 20 20 20 20 20 20 20 20 26 26 20 28 70 53 72 63          && (pSrc
144b0 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67  ->nSrc>1 || isAg
144c0 67 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f  g) ){          /
144d0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28  * Restrictions (
144e0 34 29 28 35 29 28 38 29 28 39 29 20 2a 2f 0a 20  4)(5)(8)(9) */. 
144f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
14500 20 20 20 20 0a 20 20 7d 0a 20 20 69 66 28 20 70      .  }.  if( p
14510 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20  ->isDistinct && 
14520 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20  subqueryIsAgg ) 
14530 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
14540 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
14550 20 28 36 29 20 20 2a 2f 0a 20 20 69 66 28 20 28   (6)  */.  if( (
14560 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72  p->disallowOrder
14570 42 79 20 7c 7c 20 70 2d 3e 70 4f 72 64 65 72 42  By || p->pOrderB
14580 79 29 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  y) && pSub->pOrd
14590 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74  erBy ){.     ret
145a0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
145b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145d0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
145e0 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  (11) */.  }..  /
145f0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a  * Restriction 3:
14600 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
14610 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b  y is a join, mak
14620 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75  e sure the subqu
14630 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74  ery is .  ** not
14640 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67   used as the rig
14650 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e  ht operand of an
14660 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78   outer join.  Ex
14670 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
14680 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  is.  ** is not a
14690 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
146a0 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
146b0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
146c0 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
146d0 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
146e0 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
146f0 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
14700 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
14710 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
14720 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
14730 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
14740 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
14750 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  me thing..  */. 
14760 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
14770 72 63 3e 31 20 26 26 20 28 70 53 75 62 69 74 65  rc>1 && (pSubite
14780 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
14790 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20  _OUTER)!=0 ){.  
147a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
147b0 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
147c0 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75  n 12:  If the su
147d0 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69  bquery is the ri
147e0 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
147f0 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a   left outer.  **
14800 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
14810 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
14820 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
14830 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70  e..  ** An examp
14840 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20  les of why this 
14850 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
14860 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
14870 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
14880 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  JOIN (SELECT * F
14890 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e  ROM t2 WHERE t2.
148a0 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  x>0).  **.  ** I
148b0 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
148c0 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
148d0 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
148e0 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
148f0 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57  OUTER JOIN t2) W
14900 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a  HERE t2.x>0.  **
14910 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32  .  ** But the t2
14920 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61  .x>0 test will a
14930 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20  lways fail on a 
14940 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20  NULL row of t2, 
14950 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63  which.  ** effec
14960 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20  tively converts 
14970 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69  the OUTER JOIN i
14980 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49  nto an INNER JOI
14990 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  N..  */.  if( (p
149a0 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  Subitem->jointyp
149b0 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
149c0 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65 72 65   && pSub->pWhere
149d0 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
149e0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
149f0 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
14a00 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
14a10 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
14a20 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68 65 0a  rmitted for the.
14a30 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e    ** iFrom-th en
14a40 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
14a50 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75  clause in the ou
14a60 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  ter query..  */.
14a70 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f  .  /* Move all o
14a80 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65  f the FROM eleme
14a90 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75  nts of the subqu
14aa0 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ery into the.  *
14ab0 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
14ac0 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
14ad0 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f  uery.  Before do
14ae0 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62  ing this, rememb
14af0 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  er.  ** the curs
14b00 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
14b10 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72  e original outer
14b20 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d   query FROM elem
14b30 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72  ent in.  ** iPar
14b40 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e  ent.  The iParen
14b50 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65  t cursor will ne
14b60 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75  ver be used.  Su
14b70 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20  bsequent code.  
14b80 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70  ** will scan exp
14b90 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67  ressions looking
14ba0 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66   for iParent ref
14bb0 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c  erences and repl
14bc0 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72  ace.  ** those r
14bd0 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65  eferences with e
14be0 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
14bf0 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73  resolve to the s
14c00 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a  ubquery FROM.  *
14c10 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72  * elements we ar
14c20 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e  e now copying in
14c30 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74  ..  */.  iParent
14c40 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75   = pSubitem->iCu
14c50 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e  rsor;.  {.    in
14c60 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62  t nSubSrc = pSub
14c70 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69  Src->nSrc;.    i
14c80 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53  nt jointype = pS
14c90 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
14ca0 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ;..    sqlite3De
14cb0 6c 65 74 65 54 61 62 6c 65 28 70 53 75 62 69 74  leteTable(pSubit
14cc0 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73  em->pTab);.    s
14cd0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 75 62  qlite3_free(pSub
14ce0 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  item->zDatabase)
14cf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
14d00 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  ee(pSubitem->zNa
14d10 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
14d20 5f 66 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e  _free(pSubitem->
14d30 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 53 75  zAlias);.    pSu
14d40 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  bitem->pTab = 0;
14d50 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  .    pSubitem->z
14d60 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
14d70 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d    pSubitem->zNam
14d80 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 69  e = 0;.    pSubi
14d90 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b  tem->zAlias = 0;
14da0 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63  .    if( nSubSrc
14db0 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
14dc0 65 78 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20  extra = nSubSrc 
14dd0 2d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  - 1;.      for(i
14de0 3d 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =1; i<nSubSrc; i
14df0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72  ++){.        pSr
14e00 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
14e10 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 53 72  stAppend(db, pSr
14e20 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  c, 0, 0);.      
14e30 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b    if( pSrc==0 ){
14e40 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 53  .          p->pS
14e50 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rc = 0;.        
14e60 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
14e70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14e80 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53      p->pSrc = pS
14e90 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  rc;.      for(i=
14ea0 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d  pSrc->nSrc-1; i-
14eb0 65 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d  extra>=iFrom; i-
14ec0 2d 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63  -){.        pSrc
14ed0 2d 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61  ->a[i] = pSrc->a
14ee0 5b 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20  [i-extra];.     
14ef0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72   }.    }.    for
14f00 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b  (i=0; i<nSubSrc;
14f10 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72   i++){.      pSr
14f20 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20  c->a[i+iFrom] = 
14f30 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  pSubSrc->a[i];. 
14f40 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75       memset(&pSu
14f50 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73  bSrc->a[i], 0, s
14f60 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61  izeof(pSubSrc->a
14f70 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  [i]));.    }.   
14f80 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
14f90 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74  jointype = joint
14fa0 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ype;.  }..  /* N
14fb0 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74  ow begin substit
14fc0 75 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72  uting subquery r
14fd0 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73  esult set expres
14fe0 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20  sions for .  ** 
14ff0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
15000 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65  e iParent in the
15010 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
15020 2a 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65  ** .  ** Example
15030 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45  :.  **.  **   SE
15040 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46  LECT a+5, b*10 F
15050 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20  ROM (SELECT x*3 
15060 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20  AS a, y+10 AS b 
15070 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61  FROM t1) WHERE a
15080 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20  >b;.  **   \    
15090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150a0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20   \_____________ 
150b0 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  subquery _______
150c0 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a  ___/          /.
150d0 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
150e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
150f0 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
15100 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
15110 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a  _________/.  **.
15120 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20    ** We look at 
15130 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
15140 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
15150 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c  ery and every pl
15160 61 63 65 20 77 65 20 73 65 65 0a 20 20 2a 2a 20  ace we see.  ** 
15170 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
15180 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
15190 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
151a0 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
151b0 20 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20   "y+10"..  */.  
151c0 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  pList = p->pELis
151d0 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
151e0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
151f0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
15200 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  xpr;.    if( pLi
15210 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
15220 30 20 26 26 20 28 70 45 78 70 72 20 3d 20 70 4c  0 && (pExpr = pL
15230 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
15240 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20  ->span.z!=0 ){. 
15250 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d       pList->a[i]
15260 2e 7a 4e 61 6d 65 20 3d 20 0a 20 20 20 20 20 20  .zName = .      
15270 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
15280 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
15290 72 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  r*)pExpr->span.z
152a0 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29  , pExpr->span.n)
152b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 75  ;.    }.  }.  su
152c0 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
152d0 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65  p->pEList, iPare
152e0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
152f0 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 29  );.  if( isAgg )
15300 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  {.    substExprL
15310 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75  ist(db, p->pGrou
15320 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  pBy, iParent, pS
15330 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
15340 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
15350 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
15360 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
15370 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  );.  }.  if( pSu
15380 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
15390 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
153a0 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
153b0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
153c0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
153d0 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42     pSub->pOrderB
153e0 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  y = 0;.  }else i
153f0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
15400 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  {.    substExprL
15410 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ist(db, p->pOrde
15420 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  rBy, iParent, pS
15430 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d  ub->pEList);.  }
15440 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68  .  if( pSub->pWh
15450 65 72 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72  ere ){.    pWher
15460 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
15470 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68  up(db, pSub->pWh
15480 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ere);.  }else{. 
15490 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20     pWhere = 0;. 
154a0 20 7d 0a 20 20 69 66 28 20 73 75 62 71 75 65 72   }.  if( subquer
154b0 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 61 73  yIsAgg ){.    as
154c0 73 65 72 74 28 20 70 2d 3e 70 48 61 76 69 6e 67  sert( p->pHaving
154d0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48  ==0 );.    p->pH
154e0 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72  aving = p->pWher
154f0 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65  e;.    p->pWhere
15500 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 73   = pWhere;.    s
15510 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
15520 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
15530 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
15540 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
15550 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
15560 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
15570 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
15580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15590 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
155a0 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69  (db, pSub->pHavi
155b0 6e 67 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ng));.    assert
155c0 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
155d0 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75   );.    p->pGrou
155e0 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
155f0 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 75  rListDup(db, pSu
15600 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  b->pGroupBy);.  
15610 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74  }else{.    subst
15620 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65  Expr(db, p->pWhe
15630 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  re, iParent, pSu
15640 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
15650 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
15660 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
15670 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
15680 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
15690 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79   flattened query
156a0 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20   is distinct if 
156b0 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72  either the inner
156c0 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74   or the.  ** out
156d0 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74  er query is dist
156e0 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d  inct. .  */.  p-
156f0 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d  >isDistinct = p-
15700 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70  >isDistinct || p
15710 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  Sub->isDistinct;
15720 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 45 4c 45  ..  /*.  ** SELE
15730 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c  CT ... FROM (SEL
15740 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20  ECT ... LIMIT a 
15750 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20  OFFSET b) LIMIT 
15760 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 2a 2a  x OFFSET y;.  **
15770 0a 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d  .  ** One is tem
15780 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61  pted to try to a
15790 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f  dd a and b to co
157a0 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73  mbine the limits
157b0 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 2a 2a  .  But this.  **
157c0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69   does not work i
157d0 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69  f either limit i
157e0 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 2a 2f  s negative..  */
157f0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
15800 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c  mit ){.    p->pL
15810 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69  imit = pSub->pLi
15820 6d 69 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  mit;.    pSub->p
15830 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Limit = 0;.  }..
15840 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
15850 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
15860 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
15870 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
15880 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
15890 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
158a0 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20  Delete(pSub);.  
158b0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
158c0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
158d0 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_VIEW */../*.**
158e0 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c   Analyze the SEL
158f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ECT statement pa
15900 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
15910 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74  ent to see if it
15920 0a 2a 2a 20 69 73 20 61 20 6d 69 6e 28 29 20 6f  .** is a min() o
15930 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 52  r max() query. R
15940 65 74 75 72 6e 20 4f 52 44 45 52 42 59 5f 4d 49  eturn ORDERBY_MI
15950 4e 20 6f 72 20 4f 52 44 45 52 42 59 5f 4d 41 58  N or ORDERBY_MAX
15960 20 69 66 20 0a 2a 2a 20 69 74 20 69 73 2c 20 6f   if .** it is, o
15970 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20 41  r 0 otherwise. A
15980 74 20 70 72 65 73 65 6e 74 2c 20 61 20 71 75 65  t present, a que
15990 72 79 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ry is considered
159a0 20 74 6f 20 62 65 0a 2a 2a 20 61 20 6d 69 6e 28   to be.** a min(
159b0 29 2f 6d 61 78 28 29 20 71 75 65 72 79 20 69 66  )/max() query if
159c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54 68 65  :.**.**   1. The
159d0 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20 6f  re is a single o
159e0 62 6a 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f  bject in the FRO
159f0 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
15a00 20 20 32 2e 20 54 68 65 72 65 20 69 73 20 61 20    2. There is a 
15a10 73 69 6e 67 6c 65 20 65 78 70 72 65 73 73 69 6f  single expressio
15a20 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
15a30 73 65 74 2c 20 61 6e 64 20 69 74 20 69 73 0a 2a  set, and it is.*
15a40 2a 20 20 20 20 20 20 65 69 74 68 65 72 20 6d 69  *      either mi
15a50 6e 28 78 29 20 6f 72 20 6d 61 78 28 78 29 2c 20  n(x) or max(x), 
15a60 77 68 65 72 65 20 78 20 69 73 20 61 20 63 6f 6c  where x is a col
15a70 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a  umn reference..*
15a80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 69 6e  /.static int min
15a90 4d 61 78 51 75 65 72 79 28 50 61 72 73 65 20 2a  MaxQuery(Parse *
15aa0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
15ab0 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  p){.  Expr *pExp
15ac0 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  r;.  ExprList *p
15ad0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
15ae0 74 3b 0a 0a 20 20 69 66 28 20 70 45 4c 69 73 74  t;..  if( pEList
15af0 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
15b00 75 72 6e 20 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  urn ORDERBY_NORM
15b10 41 4c 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45  AL;.  pExpr = pE
15b20 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
15b30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78  ;.  pEList = pEx
15b40 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28  pr->pList;.  if(
15b50 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
15b60 47 47 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 70  GG_FUNCTION || p
15b70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69  EList==0 || pELi
15b80 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
15b90 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
15ba0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
15bb0 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  r->op!=TK_AGG_CO
15bc0 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 4f 52  LUMN ) return OR
15bd0 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
15be0 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  if( pExpr->token
15bf0 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e 20 4f  .n!=3 ) return O
15c00 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
15c10 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
15c20 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78 70  ICmp((char*)pExp
15c30 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22  r->token.z,"min"
15c40 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ,3)==0 ){.    re
15c50 74 75 72 6e 20 4f 52 44 45 52 42 59 5f 4d 49 4e  turn ORDERBY_MIN
15c60 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
15c70 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63  lite3StrNICmp((c
15c80 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
15c90 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20  n.z,"max",3)==0 
15ca0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4f 52  ){.    return OR
15cb0 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 7d 0a 20  DERBY_MAX;.  }. 
15cc0 20 72 65 74 75 72 6e 20 4f 52 44 45 52 42 59 5f   return ORDERBY_
15cd0 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  NORMAL;.}../*.**
15ce0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
15cf0 73 6f 6c 76 65 73 20 61 6e 79 20 6e 61 6d 65 73  solves any names
15d00 20 75 73 65 64 20 69 6e 20 74 68 65 20 72 65 73   used in the res
15d10 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 0a 2a  ult set of the.*
15d20 2a 20 73 75 70 70 6c 69 65 64 20 53 45 4c 45 43  * supplied SELEC
15d30 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20  T statement. If 
15d40 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
15d50 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 73 6f 6c  ment being resol
15d60 76 65 64 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d  ved.** is a sub-
15d70 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 70 4f 75  select, then pOu
15d80 74 65 72 4e 43 20 69 73 20 61 20 70 6f 69 6e 74  terNC is a point
15d90 65 72 20 74 6f 20 74 68 65 20 4e 61 6d 65 43 6f  er to the NameCo
15da0 6e 74 65 78 74 20 0a 2a 2a 20 6f 66 20 74 68 65  ntext .** of the
15db0 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54 2e 0a   parent SELECT..
15dc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
15dd0 6c 65 63 74 52 65 73 6f 6c 76 65 28 0a 20 20 50  lectResolve(.  P
15de0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
15df0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
15e00 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
15e10 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
15e20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
15e30 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
15e40 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
15e50 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
15e60 4f 75 74 65 72 4e 43 20 20 2f 2a 20 54 68 65 20  OuterNC  /* The 
15e70 6f 75 74 65 72 20 6e 61 6d 65 20 63 6f 6e 74 65  outer name conte
15e80 78 74 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e  xt. May be NULL.
15e90 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73   */.){.  ExprLis
15ea0 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
15eb0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 73 65      /* Result se
15ec0 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  t. */.  int i;  
15ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ee0 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f 6f 70 20 76     /* For-loop v
15ef0 61 72 69 61 62 6c 65 20 75 73 65 64 20 69 6e 20  ariable used in 
15f00 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 20  multiple places 
15f10 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
15f20 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20   sNC;           
15f30 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f  /* Local name-co
15f40 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
15f50 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
15f60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67 72 6f        /* The gro
15f70 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  up by clause */.
15f80 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 72 6f  .  /* If this ro
15f90 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20 62 65  utine has run be
15fa0 66 6f 72 65 2c 20 72 65 74 75 72 6e 20 69 6d 6d  fore, return imm
15fb0 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 69  ediately. */.  i
15fc0 66 28 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64  f( p->isResolved
15fd0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15fe0 21 70 4f 75 74 65 72 4e 43 20 29 3b 0a 20 20 20  !pOuterNC );.   
15ff0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16000 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 73 52 65  K;.  }.  p->isRe
16010 73 6f 6c 76 65 64 20 3d 20 31 3b 0a 0a 20 20 2f  solved = 1;..  /
16020 2a 20 49 66 20 74 68 65 72 65 20 68 61 76 65 20  * If there have 
16030 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65 72 72  already been err
16040 6f 72 73 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ors, do nothing.
16050 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
16060 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20  ->nErr>0 ){.    
16070 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
16080 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  ROR;.  }..  /* P
16090 72 65 70 61 72 65 20 74 68 65 20 73 65 6c 65 63  repare the selec
160a0 74 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  t statement. Thi
160b0 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f  s call will allo
160c0 63 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  cate all cursors
160d0 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 74  .  ** required t
160e0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 74 61 62  o handle the tab
160f0 6c 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  les and subqueri
16100 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
16110 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  lause..  */.  if
16120 28 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74  ( prepSelectStmt
16130 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
16140 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16150 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
16160 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 65 78  * Resolve the ex
16170 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
16180 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
16190 54 20 63 6c 61 75 73 65 73 2e 20 54 68 65 73 65  T clauses. These
161a0 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c  .  ** are not al
161b0 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72 20 74  lowed to refer t
161c0 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20  o any names, so 
161d0 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20 4e 61  pass an empty Na
161e0 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a  meContext..  */.
161f0 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
16200 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
16210 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
16220 50 61 72 73 65 3b 0a 20 20 69 66 28 20 73 71 6c  Parse;.  if( sql
16230 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
16240 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4c  ames(&sNC, p->pL
16250 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20 20 20 73  imit) ||.      s
16260 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
16270 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
16280 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20  pOffset) ){.    
16290 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
162a0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ROR;.  }..  /* S
162b0 65 74 20 75 70 20 74 68 65 20 6c 6f 63 61 6c 20  et up the local 
162c0 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20  name-context to 
162d0 70 61 73 73 20 74 6f 20 45 78 70 72 52 65 73 6f  pass to ExprReso
162e0 6c 76 65 4e 61 6d 65 73 28 29 20 74 6f 0a 20 20  lveNames() to.  
162f0 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68 65 20 65  ** resolve the e
16300 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a  xpression-list..
16310 20 20 2a 2f 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77    */.  sNC.allow
16320 41 67 67 20 3d 20 31 3b 0a 20 20 73 4e 43 2e 70  Agg = 1;.  sNC.p
16330 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  SrcList = p->pSr
16340 63 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d  c;.  sNC.pNext =
16350 20 70 4f 75 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a   pOuterNC;..  /*
16360 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69   Resolve names i
16370 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
16380 2e 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20  . */.  pEList = 
16390 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
163a0 20 21 70 45 4c 69 73 74 20 29 20 72 65 74 75 72   !pEList ) retur
163b0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
163c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
163d0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
163e0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d  {.    Expr *pX =
163f0 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
16400 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  xpr;.    if( sql
16410 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
16420 61 6d 65 73 28 26 73 4e 43 2c 20 70 58 29 20 29  ames(&sNC, pX) )
16430 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
16440 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
16450 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
16460 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 67 67  there are no agg
16470 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
16480 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d 73   in the result-s
16490 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50  et, and no GROUP
164a0 20 42 59 20 0a 20 20 2a 2a 20 65 78 70 72 65 73   BY .  ** expres
164b0 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c  sion, do not all
164c0 6f 77 20 61 67 67 72 65 67 61 74 65 73 20 69 6e  ow aggregates in
164d0 20 61 6e 79 20 6f 66 20 74 68 65 20 6f 74 68 65   any of the othe
164e0 72 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  r expressions.. 
164f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
16500 2d 3e 69 73 41 67 67 20 29 3b 0a 20 20 70 47 72  ->isAgg );.  pGr
16510 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
16520 70 42 79 3b 0a 20 20 69 66 28 20 70 47 72 6f 75  pBy;.  if( pGrou
16530 70 42 79 20 7c 7c 20 73 4e 43 2e 68 61 73 41 67  pBy || sNC.hasAg
16540 67 20 29 7b 0a 20 20 20 20 70 2d 3e 69 73 41 67  g ){.    p->isAg
16550 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 1;.  }else{.
16560 20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67      sNC.allowAgg
16570 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
16580 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75  If a HAVING clau
16590 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74  se is present, t
165a0 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
165b0 65 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  e a GROUP BY cla
165c0 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use..  */.  if( 
165d0 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20 21 70  p->pHaving && !p
165e0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73  GroupBy ){.    s
165f0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16600 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20  Parse, "a GROUP 
16610 42 59 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  BY clause is req
16620 75 69 72 65 64 20 62 65 66 6f 72 65 20 48 41 56  uired before HAV
16630 49 4e 47 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ING");.    retur
16640 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
16650 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68    }..  /* Add th
16660 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
16670 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 2d 63 6f  t to the name-co
16680 6e 74 65 78 74 20 62 65 66 6f 72 65 20 70 61 72  ntext before par
16690 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6f 74  sing the.  ** ot
166a0 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20  her expressions 
166b0 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  in the SELECT st
166c0 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
166d0 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20 65 78   so that.  ** ex
166e0 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
166f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 28 65   WHERE clause (e
16700 74 63 2e 29 20 63 61 6e 20 72 65 66 65 72 20 74  tc.) can refer t
16710 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79  o expressions by
16720 0a 20 20 2a 2a 20 61 6c 69 61 73 65 73 20 69 6e  .  ** aliases in
16730 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
16740 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 69 6e 6f 72  .  **.  ** Minor
16750 20 70 6f 69 6e 74 3a 20 49 66 20 74 68 69 73 20   point: If this 
16760 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
16770 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
16780 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 72 65   will be.  ** re
16790 2d 65 76 61 6c 75 61 74 65 64 20 66 6f 72 20 65  -evaluated for e
167a0 61 63 68 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ach reference to
167b0 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e   it..  */.  sNC.
167c0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
167d0 73 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  st;.  if( sqlite
167e0 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
167f0 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72  s(&sNC, p->pWher
16800 65 29 20 7c 7c 0a 20 20 20 20 20 73 71 6c 69 74  e) ||.     sqlit
16810 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
16820 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 48 61 76  es(&sNC, p->pHav
16830 69 6e 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ing) ){.    retu
16840 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
16850 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 50  .  }.  if( p->pP
16860 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69  rior==0 ){.    i
16870 66 28 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47  f( processOrderG
16880 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
16890 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 31  , p->pOrderBy, 1
168a0 2c 20 26 73 4e 43 2e 68 61 73 41 67 67 29 20 29  , &sNC.hasAgg) )
168b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
168c0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
168d0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 6f   }.  }.  if( pro
168e0 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79  cessOrderGroupBy
168f0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 47 72 6f  (pParse, p, pGro
16900 75 70 42 79 2c 20 30 2c 20 26 73 4e 43 2e 68 61  upBy, 0, &sNC.ha
16910 73 41 67 67 29 20 29 7b 0a 20 20 20 20 72 65 74  sAgg) ){.    ret
16920 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
16930 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
16940 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
16950 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
16960 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
16970 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
16980 20 73 75 72 65 20 74 68 65 20 47 52 4f 55 50 20   sure the GROUP 
16990 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  BY clause does n
169a0 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67 67 72 65  ot contain aggre
169b0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  gate functions..
169c0 20 20 2a 2f 0a 20 20 69 66 28 20 70 47 72 6f 75    */.  if( pGrou
169d0 70 42 79 20 29 7b 0a 20 20 20 20 73 74 72 75 63  pBy ){.    struc
169e0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
169f0 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 20 20 66  *pItem;.  .    f
16a00 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 47  or(i=0, pItem=pG
16a10 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47 72  roupBy->a; i<pGr
16a20 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  oupBy->nExpr; i+
16a30 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
16a40 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
16a50 6f 70 65 72 74 79 28 70 49 74 65 6d 2d 3e 70 45  operty(pItem->pE
16a60 78 70 72 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a  xpr, EP_Agg) ){.
16a70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
16a80 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
16a90 22 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74  "aggregate funct
16aa0 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c  ions are not all
16ab0 6f 77 65 64 20 69 6e 20 22 0a 20 20 20 20 20 20  owed in ".      
16ac0 20 20 20 20 20 20 22 74 68 65 20 47 52 4f 55 50        "the GROUP
16ad0 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a 20 20   BY clause");.  
16ae0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16af0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
16b00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
16b10 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6f 6e  /* If this is on
16b20 65 20 53 45 4c 45 43 54 20 6f 66 20 61 20 63 6f  e SELECT of a co
16b30 6d 70 6f 75 6e 64 2c 20 62 65 20 73 75 72 65 20  mpound, be sure 
16b40 74 6f 20 72 65 73 6f 6c 76 65 20 6e 61 6d 65 73  to resolve names
16b50 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 74 68  .  ** in the oth
16b60 65 72 20 53 45 4c 45 43 54 73 2e 0a 20 20 2a 2f  er SELECTs..  */
16b70 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
16b80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
16b90 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f  qlite3SelectReso
16ba0 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  lve(pParse, p->p
16bb0 50 72 69 6f 72 2c 20 70 4f 75 74 65 72 4e 43 29  Prior, pOuterNC)
16bc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
16bd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16be0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
16bf0 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
16c00 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  e accumulator..*
16c10 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61  *.** The aggrega
16c20 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69  te accumulator i
16c30 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72  s a set of memor
16c40 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c  y cells that hol
16c50 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74  d.** intermediat
16c60 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20  e results while 
16c70 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61  calculating an a
16c80 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a  ggregate.  This.
16c90 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c  ** routine simpl
16ca0 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69  y stores NULLs i
16cb0 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d  n all of those m
16cc0 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  emory cells..*/.
16cd0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65  static void rese
16ce0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  tAccumulator(Par
16cf0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
16d00 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
16d10 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
16d20 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
16d30 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
16d40 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63  Info_func *pFunc
16d50 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f  ;.  if( pAggInfo
16d60 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f  ->nFunc+pAggInfo
16d70 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a  ->nColumn==0 ){.
16d80 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
16d90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
16da0 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  gInfo->nColumn; 
16db0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
16dc0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16dd0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49  P_Null, 0, pAggI
16de0 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
16df0 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46  m);.  }.  for(pF
16e00 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46  unc=pAggInfo->aF
16e10 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67  unc, i=0; i<pAgg
16e20 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
16e30 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20  , pFunc++){.    
16e40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16e50 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
16e60 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20   pFunc->iMem);. 
16e70 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44     if( pFunc->iD
16e80 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
16e90 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
16ea0 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Func->pExpr;.   
16eb0 20 20 20 69 66 28 20 70 45 2d 3e 70 4c 69 73 74     if( pE->pList
16ec0 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 4c 69 73 74  ==0 || pE->pList
16ed0 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
16ee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
16ef0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44  orMsg(pParse, "D
16f00 49 53 54 49 4e 43 54 20 69 6e 20 61 67 67 72 65  ISTINCT in aggre
16f10 67 61 74 65 20 6d 75 73 74 20 62 65 20 66 6f 6c  gate must be fol
16f20 6c 6f 77 65 64 20 22 0a 20 20 20 20 20 20 20 20  lowed ".        
16f30 20 20 20 22 62 79 20 61 6e 20 65 78 70 72 65 73     "by an expres
16f40 73 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  sion");.        
16f50 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
16f60 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
16f70 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49  se{.        KeyI
16f80 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
16f90 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
16fa0 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e  ist(pParse, pE->
16fb0 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pList);.        
16fc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16fd0 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
16fe0 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44  meral, pFunc->iD
16ff0 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  istinct, 0, 0,. 
17000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17010 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
17020 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
17030 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
17040 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
17050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
17060 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c   the OP_AggFinal
17070 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65  ize opcode for e
17080 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66  very aggregate f
17090 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  unction.** in th
170a0 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74  e AggInfo struct
170b0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
170c0 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46  oid finalizeAggF
170d0 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a  unctions(Parse *
170e0 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
170f0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
17100 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
17110 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
17120 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
17130 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72  _func *pF;.  for
17140 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
17150 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
17160 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
17170 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70  , pF++){.    Exp
17180 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
17190 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b  F->pExpr->pList;
171a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
171b0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67  AddOp4(v, OP_Agg
171c0 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c  Final, pF->iMem,
171d0 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
171e0 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20  nExpr : 0, 0,.  
171f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17200 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70      (void*)pF->p
17210 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
17220 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
17230 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d  Update the accum
17240 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65  ulator memory ce
17250 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65  lls for an aggre
17260 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  gate based on.**
17270 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
17280 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
17290 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64  .static void upd
172a0 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  ateAccumulator(P
172b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
172c0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
172d0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
172e0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
172f0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
17300 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
17310 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
17320 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41  o_col *pC;..  pA
17330 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
17340 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  de = 1;.  for(i=
17350 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
17360 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
17370 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
17380 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41  F++){.    int nA
17390 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  rg;.    int addr
173a0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Next = 0;.    in
173b0 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78  t regAgg;.    Ex
173c0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
173d0 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74  pF->pExpr->pList
173e0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
173f0 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  ){.      nArg = 
17400 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
17410 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c      regAgg = sql
17420 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
17430 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a  (pParse, nArg);.
17440 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17450 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
17460 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67  arse, pList, reg
17470 41 67 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Agg);.    }else{
17480 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b  .      nArg = 0;
17490 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20  .      regAgg = 
174a0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
174b0 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d   pF->iDistinct>=
174c0 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e  0 ){.      addrN
174d0 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ext = sqlite3Vdb
174e0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
174f0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72       assert( nAr
17500 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63 6f  g==1 );.      co
17510 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73  deDistinct(pPars
17520 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  e, pF->iDistinct
17530 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72  , addrNext, 1, r
17540 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20  egAgg);.    }.  
17550 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d    if( pF->pFunc-
17560 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a  >needCollSeq ){.
17570 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
17580 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Coll = 0;.      
17590 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
175a0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
175b0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
175c0 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
175d0 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30   );  /* pList!=0
175e0 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e   if pF->pFunc->n
175f0 65 65 64 43 6f 6c 6c 53 65 71 20 69 73 20 74 72  eedCollSeq is tr
17600 75 65 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  ue */.      for(
17610 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  j=0, pItem=pList
17620 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a  ->a; !pColl && j
17630 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65  <nArg; j++, pIte
17640 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43  m++){.        pC
17650 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
17660 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
17670 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
17680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17690 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
176a0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72      pColl = pPar
176b0 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
176c0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
176d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
176e0 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p4(v, OP_CollSeq
176f0 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
17700 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
17710 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20  LSEQ);.    }.   
17720 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17730 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70  p4(v, OP_AggStep
17740 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d  , 0, regAgg, pF-
17750 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20  >iMem,.         
17760 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
17770 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50  id*)pF->pFunc, P
17780 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
17790 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
177a0 65 50 35 28 76 2c 20 6e 41 72 67 29 3b 0a 20 20  eP5(v, nArg);.  
177b0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
177c0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
177d0 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
177e0 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78  .    if( addrNex
177f0 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
17800 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
17810 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b  el(v, addrNext);
17820 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
17830 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66  (i=0, pC=pAggInf
17840 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49  o->aCol; i<pAggI
17850 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
17860 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20  r; i++, pC++){. 
17870 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
17880 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70  de(pParse, pC->p
17890 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b  Expr, pC->iMem);
178a0 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d  .  }.  pAggInfo-
178b0 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b  >directMode = 0;
178c0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
178d0 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
178e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
178f0 69 6f 6e 20 69 73 20 75 73 65 64 20 77 68 65 6e  ion is used when
17900 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
17910 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 63  ent is used to c
17920 72 65 61 74 65 20 61 0a 2a 2a 20 74 65 6d 70 6f  reate a.** tempo
17930 72 61 72 79 20 74 61 62 6c 65 20 66 6f 72 20 69  rary table for i
17940 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
17950 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 61 6e   when running an
17960 20 49 4e 53 54 45 41 44 20 4f 46 0a 2a 2a 20 55   INSTEAD OF.** U
17970 50 44 41 54 45 20 6f 72 20 49 4e 53 54 45 41 44  PDATE or INSTEAD
17980 20 4f 46 20 44 45 4c 45 54 45 20 74 72 69 67 67   OF DELETE trigg
17990 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6f  er. .**.** If po
179a0 73 73 69 62 6c 65 2c 20 74 68 65 20 53 45 4c 45  ssible, the SELE
179b0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  CT statement is 
179c0 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61 74  modified so that
179d0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 0a 2a 2a 20   NULL values.** 
179e0 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
179f0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
17a00 65 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e  e for all column
17a10 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  s for which the 
17a20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
17a30 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e  g bit in argumen
17a40 74 20 6d 61 73 6b 20 69 73 20 6e 6f 74 20 73 65  t mask is not se
17a50 74 2e 20 49 66 20 6d 61 73 6b 20 74 61 6b 65 73  t. If mask takes
17a60 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 61 6c 20   the.** special 
17a70 76 61 6c 75 65 20 30 78 66 66 66 66 66 66 66 66  value 0xffffffff
17a80 2c 20 74 68 65 6e 20 61 6c 6c 20 63 6f 6c 75 6d  , then all colum
17a90 6e 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64  ns are populated
17aa0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17ab0 53 65 6c 65 63 74 4d 61 73 6b 28 50 61 72 73 65  SelectMask(Parse
17ac0 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
17ad0 20 2a 70 2c 20 75 33 32 20 6d 61 73 6b 29 7b 0a   *p, u32 mask){.
17ae0 20 20 69 66 28 20 21 70 2d 3e 70 50 72 69 6f 72    if( !p->pPrior
17af0 20 26 26 20 21 70 2d 3e 69 73 44 69 73 74 69 6e   && !p->isDistin
17b00 63 74 20 26 26 20 6d 61 73 6b 21 3d 30 78 66 66  ct && mask!=0xff
17b10 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 45 78  ffffff ){.    Ex
17b20 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
17b30 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
17b40 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
17b50 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20  Resolve(pParse, 
17b60 70 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72  p, 0) ){.      r
17b70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
17b80 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45  OR;.    }.    pE
17b90 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
17ba0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
17bb0 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26  <pEList->nExpr &
17bc0 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20 20  & i<32; i++){.  
17bd0 20 20 20 20 69 66 28 20 21 28 6d 61 73 6b 26 28      if( !(mask&(
17be0 28 75 33 32 29 31 3c 3c 69 29 29 20 29 7b 0a 20  (u32)1<<i)) ){. 
17bf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
17c00 70 72 44 65 6c 65 74 65 28 70 45 4c 69 73 74 2d  prDelete(pEList-
17c10 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
17c20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b        pEList->a[
17c30 69 5d 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  i].pExpr = sqlit
17c40 65 33 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64  e3Expr(pParse->d
17c50 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30  b, TK_NULL, 0, 0
17c60 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
17c70 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17c80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
17c90 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
17ca0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
17cb0 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73  e given SELECT s
17cc0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
17cd0 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
17ce0 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76  distributed in v
17cf0 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65  arious ways depe
17d00 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20  nding on the.** 
17d10 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
17d20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
17d30 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  ture pointed to 
17d40 62 79 20 61 72 67 75 6d 65 6e 74 20 70 44 65 73  by argument pDes
17d50 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t.** as follows:
17d60 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73 74  .**.**     pDest
17d70 2d 3e 65 44 65 73 74 20 20 20 20 52 65 73 75 6c  ->eDest    Resul
17d80 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  t.**     -------
17d90 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
17da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17dc0 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ----.**     SRT_
17dd0 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f  Callback    Invo
17de0 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  ke the callback 
17df0 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20  for each row of 
17e00 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
17e10 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20  *     SRT_Mem   
17e20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69 72 73        Store firs
17e30 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f  t result in memo
17e40 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69  ry cell pDest->i
17e50 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
17e60 52 54 5f 53 65 74 20 20 20 20 20 20 20 20 20 53  RT_Set         S
17e70 74 6f 72 65 20 6e 6f 6e 2d 6e 75 6c 6c 20 72 65  tore non-null re
17e80 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66  sults as keys of
17e90 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50   table pDest->iP
17ea0 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20  arm. .**        
17eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 41 70 70               App
17ec0 6c 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  ly the affinity 
17ed0 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 20  pDest->affinity 
17ee0 62 65 66 6f 72 65 20 73 74 6f 72 69 6e 67 20 74  before storing t
17ef0 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  hem..**.**     S
17f00 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53  RT_Union       S
17f10 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20  tore results as 
17f20 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f  a key in a tempo
17f30 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74  rary table pDest
17f40 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  ->iParm..**.**  
17f50 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20 20     SRT_Except   
17f60 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74     Remove result
17f70 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f  s from the tempo
17f80 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74  rary table pDest
17f90 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  ->iParm..**.**  
17fa0 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20     SRT_Table    
17fb0 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
17fc0 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   in temporary ta
17fd0 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ble pDest->iParm
17fe0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45  .**.**     SRT_E
17ff0 70 68 65 6d 54 61 62 20 20 20 20 43 72 65 61 74  phemTab    Creat
18000 65 20 61 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  e an temporary t
18010 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72  able pDest->iPar
18020 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 20  m and store.**  
18030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18040 20 20 20 74 68 65 20 72 65 73 75 6c 74 20 74 68     the result th
18050 65 72 65 2e 20 54 68 65 20 63 75 72 73 6f 72 20  ere. The cursor 
18060 69 73 20 6c 65 66 74 20 6f 70 65 6e 20 61 66 74  is left open aft
18070 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  er.**           
18080 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
18090 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ing..**.**     S
180a0 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 20 46  RT_Subroutine  F
180b0 6f 72 20 65 61 63 68 20 72 6f 77 20 72 65 74 75  or each row retu
180c0 72 6e 65 64 2c 20 70 75 73 68 20 74 68 65 20 72  rned, push the r
180d0 65 73 75 6c 74 73 20 6f 6e 74 6f 20 74 68 65 0a  esults onto the.
180e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
180f0 20 20 20 20 20 20 20 76 64 62 65 20 73 74 61 63         vdbe stac
18100 6b 20 61 6e 64 20 63 61 6c 6c 20 74 68 65 20 73  k and call the s
18110 75 62 72 6f 75 74 69 6e 65 20 28 76 69 61 20 4f  ubroutine (via O
18120 50 5f 47 6f 73 75 62 29 0a 2a 2a 20 20 20 20 20  P_Gosub).**     
18130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18140 61 74 20 61 64 64 72 65 73 73 20 70 44 65 73 74  at address pDest
18150 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  ->iParm..**.**  
18160 20 20 20 53 52 54 5f 45 78 69 73 74 73 20 20 20     SRT_Exists   
18170 20 20 20 53 74 6f 72 65 20 61 20 31 20 69 6e 20     Store a 1 in 
18180 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65 73  memory cell pDes
18190 74 2d 3e 69 50 61 72 6d 20 69 66 20 74 68 65 20  t->iParm if the 
181a0 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  result.**       
181b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
181c0 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a  t is not empty..
181d0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44 69  **.**     SRT_Di
181e0 73 63 61 72 64 20 20 20 20 20 54 68 72 6f 77 20  scard     Throw 
181f0 74 68 65 20 72 65 73 75 6c 74 73 20 61 77 61 79  the results away
18200 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20  ..**.** See the 
18210 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
18220 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  ) function for a
18230 20 63 61 6e 6f 6e 69 63 61 6c 20 6c 69 73 74 69   canonical listi
18240 6e 67 20 6f 66 20 74 68 65 20 0a 2a 2a 20 61 6c  ng of the .** al
18250 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20  lowed values of 
18260 65 44 65 73 74 20 61 6e 64 20 74 68 65 69 72 20  eDest and their 
18270 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20  meanings..**.** 
18280 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
18290 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
182a0 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  of errors.  If a
182b0 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a  ny errors are.**
182c0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
182d0 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  en an appropriat
182e0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
182f0 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50  is left in.** pP
18300 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
18310 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18320 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20  e does NOT free 
18330 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63  the Select struc
18340 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20  ture passed in. 
18350 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
18360 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  function needs t
18370 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a  o do that..**.**
18380 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20 70 61   The pParent, pa
18390 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70 50  rentTab, and *pP
183a0 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64 73 20  arentAgg fields 
183b0 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20 69 66  are filled in if
183c0 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20   this.** SELECT 
183d0 69 73 20 61 20 73 75 62 71 75 65 72 79 2e 20 20  is a subquery.  
183e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
183f0 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20   try to combine 
18400 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77  this SELECT.** w
18410 69 74 68 20 69 74 73 20 70 61 72 65 6e 74 20 74  ith its parent t
18420 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  o form a single 
18430 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49 6e 20  flat query.  In 
18440 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67  so doing, it mig
18450 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68 65  ht.** change the
18460 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 66 72   parent query fr
18470 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61  om a non-aggrega
18480 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65 67 61  te to an aggrega
18490 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72  te query..** For
184a0 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 74 68   that reason, th
184b0 65 20 70 50 61 72 65 6e 74 41 67 67 20 66 6c 61  e pParentAgg fla
184c0 67 20 69 73 20 70 61 73 73 65 64 20 61 73 20 61  g is passed as a
184d0 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a   pointer, so it.
184e0 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ** can be change
184f0 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  d..**.** Example
18500 20 31 3a 20 20 20 54 68 65 20 6d 65 61 6e 69 6e   1:   The meanin
18510 67 20 6f 66 20 74 68 65 20 70 50 61 72 65 6e 74  g of the pParent
18520 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
18530 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
18540 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45  OM t1 JOIN (SELE
18550 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46  CT x, count(*) F
18560 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b  ROM t2) JOIN t3;
18570 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20 20 20 20  .**    \        
18580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
18590 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
185a0 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
185b0 2f 0a 2a 2a 20 20 20 20 20 5c 20 20 20 20 20 20  /.**     \      
185c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185f0 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f  /.**      \_____
18600 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20  _______________ 
18610 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f  outer query ____
18620 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
18630 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18640 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ine is called fo
18650 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
18660 79 20 66 69 72 73 74 2e 20 20 20 46 6f 72 20 74  y first.   For t
18670 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61  hat call,.** pPa
18680 72 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  rent will be NUL
18690 4c 2e 20 20 44 75 72 69 6e 67 20 74 68 65 20 70  L.  During the p
186a0 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65  rocessing of the
186b0 20 6f 75 74 65 72 20 71 75 65 72 79 2c 20 74 68   outer query, th
186c0 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  is .** routine i
186d0 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  s called recursi
186e0 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20 74  vely to handle t
186f0 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 46 6f  he subquery.  Fo
18700 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 0a  r the recursive.
18710 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74  ** call, pParent
18720 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74   will point to t
18730 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
18740 20 42 65 63 61 75 73 65 20 74 68 65 20 73 75 62   Because the sub
18750 71 75 65 72 79 20 69 73 0a 2a 2a 20 74 68 65 20  query is.** the 
18760 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69  second element i
18770 6e 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  n a three-way jo
18780 69 6e 2c 20 74 68 65 20 70 61 72 65 6e 74 54 61  in, the parentTa
18790 62 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c  b parameter will
187a0 0a 2a 2a 20 62 65 20 31 20 28 74 68 65 20 32 6e  .** be 1 (the 2n
187b0 64 20 76 61 6c 75 65 20 6f 66 20 61 20 30 2d 69  d value of a 0-i
187c0 6e 64 65 78 65 64 20 61 72 72 61 79 2e 29 0a 2a  ndexed array.).*
187d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
187e0 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
187f0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
18800 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
18810 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
18820 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
18830 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
18840 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
18850 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ded. */.  Select
18860 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
18870 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
18880 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65  ith the query re
18890 73 75 6c 74 73 20 2a 2f 0a 20 20 53 65 6c 65 63  sults */.  Selec
188a0 74 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20  t *pParent,     
188b0 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
188c0 45 43 54 20 66 6f 72 20 77 68 69 63 68 20 74 68  ECT for which th
188d0 69 73 20 69 73 20 61 20 73 75 62 2d 71 75 65 72  is is a sub-quer
188e0 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e  y */.  int paren
188f0 74 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a  tTab,         /*
18900 20 49 6e 64 65 78 20 69 6e 20 70 50 61 72 65 6e   Index in pParen
18910 74 2d 3e 70 53 72 63 20 6f 66 20 74 68 69 73 20  t->pSrc of this 
18920 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  query */.  int *
18930 70 50 61 72 65 6e 74 41 67 67 2c 20 20 20 20 20  pParentAgg,     
18940 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61    /* True if pPa
18950 72 65 6e 74 20 75 73 65 73 20 61 67 67 72 65 67  rent uses aggreg
18960 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
18970 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20  .  char *aff    
18980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
18990 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69  eDest is SRT_Uni
189a0 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79  on, the affinity
189b0 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
189c0 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
189d0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
189e0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65  ounters */.  Whe
189f0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
18a00 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72      /* Return fr
18a10 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  om sqlite3WhereB
18a20 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65  egin() */.  Vdbe
18a30 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
18a40 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
18a50 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20  l machine under 
18a60 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
18a70 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20    int isAgg;    
18a80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
18a90 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74   for select list
18aa0 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29  s like "count(*)
18ab0 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  " */.  ExprList 
18ac0 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a  *pEList;      /*
18ad0 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   List of columns
18ae0 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a   to extract. */.
18af0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
18b00 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist;     /* List
18b10 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65   of tables to se
18b20 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45  lect from */.  E
18b30 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
18b40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
18b50 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  RE clause.  May 
18b60 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
18b70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
18b80 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
18b90 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79   BY clause.  May
18ba0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
18bb0 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
18bc0 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55  ;    /* The GROU
18bd0 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  P BY clause.  Ma
18be0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
18bf0 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20  xpr *pHaving;   
18c00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56        /* The HAV
18c10 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ING clause.  May
18c20 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
18c30 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20  t isDistinct;   
18c40 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
18c50 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
18c60 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
18c70 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63  */.  int distinc
18c80 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
18c90 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20  able to use for 
18ca0 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74  the distinct set
18cb0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31   */.  int rc = 1
18cc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18cd0 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
18ce0 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
18cf0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  on */.  int addr
18d00 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20 20 2f  SortIndex;     /
18d10 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20  * Address of an 
18d20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
18d30 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
18d40 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e    AggInfo sAggIn
18d50 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f  fo;      /* Info
18d60 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20  rmation used by 
18d70 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
18d80 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b  s */.  int iEnd;
18d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18da0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
18db0 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79  end of the query
18dc0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
18dd0 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
18de0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
18df0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62  nection */..  db
18e00 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
18e10 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d   if( p==0 || db-
18e20 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
18e30 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
18e40 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
18e50 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
18e60 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
18e70 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
18e80 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
18e90 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26  rn 1;.  memset(&
18ea0 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  sAggInfo, 0, siz
18eb0 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a  eof(sAggInfo));.
18ec0 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
18ed0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28  >pOrderBy;.  if(
18ee0 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62   IgnorableOrderb
18ef0 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
18f00 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
18f10 0a 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 73  ..    /* In thes
18f20 65 20 63 61 73 65 73 20 74 68 65 20 44 49 53 54  e cases the DIST
18f30 49 4e 43 54 20 6f 70 65 72 61 74 6f 72 20 6d 61  INCT operator ma
18f40 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63  kes no differenc
18f50 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  e to the.    ** 
18f60 72 65 73 75 6c 74 73 2c 20 73 6f 20 72 65 6d 6f  results, so remo
18f70 76 65 20 69 74 20 69 66 20 69 74 20 77 65 72 65  ve it if it were
18f80 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20   specified..    
18f90 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 70 44  */.    assert(pD
18fa0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
18fb0 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d  Exists || pDest-
18fc0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f  >eDest==SRT_Unio
18fd0 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  n || .          
18fe0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
18ff0 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65  RT_Except || pDe
19000 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
19010 69 73 63 61 72 64 29 3b 0a 20 20 20 20 70 2d 3e  iscard);.    p->
19020 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  isDistinct = 0;.
19030 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
19040 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70  3SelectResolve(p
19050 50 61 72 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a  Parse, p, 0) ){.
19060 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
19070 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f  end;.  }.  p->pO
19080 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
19090 79 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  y;..#ifndef SQLI
190a0 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
190b0 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20  _SELECT.  /* If 
190c0 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73  there is are a s
190d0 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69  equence of queri
190e0 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69  es, do the earli
190f0 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20  er ones first.. 
19100 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
19110 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ior ){.    if( p
19120 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20  ->pRightmost==0 
19130 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  ){.      Select 
19140 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69 67 68 74 20  *pLoop, *pRight 
19150 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 63  = 0;.      int c
19160 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f  nt = 0;.      fo
19170 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
19180 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
19190 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20  Prior, cnt++){. 
191a0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52         pLoop->pR
191b0 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20  ightmost = p;.  
191c0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65        pLoop->pNe
191d0 78 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  xt = pRight;.   
191e0 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
191f0 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oop;.      }.   
19200 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4d 41     if( SQLITE_MA
19210 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
19220 54 3e 30 20 26 26 20 63 6e 74 3e 53 51 4c 49 54  T>0 && cnt>SQLIT
19230 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
19240 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20  ELECT ){.       
19250 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
19260 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
19270 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70  ny terms in comp
19280 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20  ound SELECT");. 
19290 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
192a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
192b0 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53     return multiS
192c0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
192d0 20 70 44 65 73 74 2c 20 61 66 66 29 3b 0a 20 20   pDest, aff);.  
192e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  }.#endif..  /* M
192f0 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73  ake local copies
19300 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
19310 72 73 20 66 6f 72 20 74 68 69 73 20 71 75 65 72  rs for this quer
19320 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69  y..  */.  pTabLi
19330 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
19340 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
19350 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d  re;.  pGroupBy =
19360 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
19370 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
19380 76 69 6e 67 3b 0a 20 20 69 73 41 67 67 20 3d 20  ving;.  isAgg = 
19390 70 2d 3e 69 73 41 67 67 3b 0a 20 20 69 73 44 69  p->isAgg;.  isDi
193a0 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69  stinct = p->isDi
193b0 73 74 69 6e 63 74 3b 0a 20 20 70 45 4c 69 73 74  stinct;.  pEList
193c0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
193d0 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 20  if( pEList==0 ) 
193e0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
193f0 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20  ..  /* .  ** Do 
19400 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74  not even attempt
19410 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79   to generate any
19420 20 63 6f 64 65 20 69 66 20 77 65 20 68 61 76 65   code if we have
19430 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20   already seen.  
19440 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65  ** errors before
19450 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74   this routine st
19460 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  arts..  */.  if(
19470 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
19480 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
19490 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74  d;..  /* If writ
194a0 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72  ing to memory or
194b0 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65   generating a se
194c0 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69  t.  ** only a si
194d0 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20  ngle column may 
194e0 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
194f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19500 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69  MIT_SUBQUERY.  i
19510 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69  f( checkForMulti
19520 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f  ColumnSelectErro
19530 72 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c  r(pParse, pDest,
19540 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20   pEList->nExpr) 
19550 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
19560 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
19570 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42  if..  /* ORDER B
19580 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  Y is ignored for
19590 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f   some destinatio
195a0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ns..  */.  if( I
195b0 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
195c0 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70 4f  pDest) ){.    pO
195d0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
195e0 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
195f0 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
19600 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
19610 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
19620 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
19630 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
19640 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
19650 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
19660 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
19670 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69  M clause.  */.#i
19680 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
19690 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
196a0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
196b0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
196c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
196d0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
196e0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
196f0 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
19700 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ext = 0;.    int
19710 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
19720 65 78 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ext;.    struct 
19730 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
19740 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
19750 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
19760 74 44 65 73 74 20 64 65 73 74 3b 0a 0a 20 20 20  tDest dest;..   
19770 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
19780 65 63 74 3d 3d 30 20 7c 7c 20 70 49 74 65 6d 2d  ect==0 || pItem-
19790 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 29 20 63  >isPopulated ) c
197a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
197b0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30   pItem->zName!=0
197c0 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65 64   ){.      zSaved
197d0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50  AuthContext = pP
197e0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
197f0 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  xt;.      pParse
19800 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
19810 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20   pItem->zName;. 
19820 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65       needRestore
19830 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20 20  Context = 1;.   
19840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65   }else{.      ne
19850 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74  edRestoreContext
19860 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 69 66 20   = 0;.    }.#if 
19870 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
19880 45 53 54 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  EST) || SQLITE_M
19890 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
198a0 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
198b0 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62   Parse.nHeight b
198c0 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20  y the height of 
198d0 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70 72  the largest expr
198e0 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72  ession.    ** tr
198f0 65 65 20 72 65 66 65 72 65 64 20 74 6f 20 62 79  ee refered to by
19900 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e   this, the paren
19910 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68  t select. The ch
19920 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a  ild select.    *
19930 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78  * may contain ex
19940 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f  pression trees o
19950 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a  f at most.    **
19960 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50   (SQLITE_MAX_EXP
19970 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48  R_DEPTH-Parse.nH
19980 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54  eight) height. T
19990 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20  his is a bit.   
199a0 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76   ** more conserv
199b0 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73  ative than neces
199c0 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65  sary, but much e
199d0 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72  asier than enfor
199e0 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65  cing.    ** an e
199f0 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20  xact limit..    
19a00 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
19a10 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65  Height += sqlite
19a20 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
19a30 74 28 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  t(p);.#endif.   
19a40 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
19a50 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
19a60 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65  T_EphemTab, pIte
19a70 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
19a80 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
19a90 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Parse, pItem->pS
19aa0 65 6c 65 63 74 2c 20 26 64 65 73 74 2c 20 70 2c  elect, &dest, p,
19ab0 20 69 2c 20 26 69 73 41 67 67 2c 20 30 29 3b 0a   i, &isAgg, 0);.
19ac0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
19ad0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
19ae0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
19af0 64 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66  d;.    }.#if def
19b00 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
19b10 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
19b20 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20  EXPR_DEPTH>0.   
19b30 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
19b40 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   -= sqlite3Selec
19b50 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
19b60 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6e  #endif.    if( n
19b70 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
19b80 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  t ){.      pPars
19b90 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
19ba0 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74  = zSavedAuthCont
19bb0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ext;.    }.    p
19bc0 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
19bd0 63 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  c;.    pWhere = 
19be0 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 69  p->pWhere;.    i
19bf0 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64  f( !IgnorableOrd
19c00 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
19c10 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
19c20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
19c30 20 7d 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20   }.    pGroupBy 
19c40 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
19c50 20 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e     pHaving = p->
19c60 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 69 73 44  pHaving;.    isD
19c70 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
19c80 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 23 65 6e  istinct;.  }.#en
19c90 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  dif..  /* Check 
19ca0 66 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 20  for the special 
19cb0 63 61 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20  case of a min() 
19cc0 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
19cd0 6e 20 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a  n by itself.  **
19ce0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
19cf0 65 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20  et..  */.#if 0. 
19d00 20 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61   if( simpleMinMa
19d10 78 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  xQuery(pParse, p
19d20 2c 20 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  , pDest) ){.    
19d30 72 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  rc = 0;.    goto
19d40 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
19d50 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68  .#endif..  /* Ch
19d60 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
19d70 69 73 20 69 73 20 61 20 73 75 62 71 75 65 72 79  is is a subquery
19d80 20 74 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c   that can be "fl
19d90 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74  attened" into it
19da0 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49  s parent..  ** I
19db0 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
19dc0 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f  a possiblity, do
19dd0 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69   so and return i
19de0 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20  mmediately.  .  
19df0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
19e00 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66  E_OMIT_VIEW.  if
19e10 28 20 70 50 61 72 65 6e 74 20 26 26 20 70 50 61  ( pParent && pPa
19e20 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20  rentAgg &&.     
19e30 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
19e40 28 64 62 2c 20 70 50 61 72 65 6e 74 2c 20 70 61  (db, pParent, pa
19e50 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72 65 6e  rentTab, *pParen
19e60 74 41 67 67 2c 20 69 73 41 67 67 29 20 29 7b 0a  tAgg, isAgg) ){.
19e70 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29 20      if( isAgg ) 
19e80 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20 31 3b  *pParentAgg = 1;
19e90 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
19ea0 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  _end;.  }.#endif
19eb0 0a 0a 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62  ..  /* If possib
19ec0 6c 65 2c 20 72 65 77 72 69 74 65 20 74 68 65 20  le, rewrite the 
19ed0 71 75 65 72 79 20 74 6f 20 75 73 65 20 47 52 4f  query to use GRO
19ee0 55 50 20 42 59 20 69 6e 73 74 65 61 64 20 6f 66  UP BY instead of
19ef0 20 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2a 20   DISTINCT..  ** 
19f00 47 52 4f 55 50 20 42 59 20 6d 61 79 20 75 73 65  GROUP BY may use
19f10 20 61 6e 20 69 6e 64 65 78 2c 20 44 49 53 54 49   an index, DISTI
19f20 4e 43 54 20 6e 65 76 65 72 20 64 6f 65 73 2e 0a  NCT never does..
19f30 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73    */.  if( p->is
19f40 44 69 73 74 69 6e 63 74 20 26 26 20 21 70 2d 3e  Distinct && !p->
19f50 69 73 41 67 67 20 26 26 20 21 70 2d 3e 70 47 72  isAgg && !p->pGr
19f60 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 70 2d 3e  oupBy ){.    p->
19f70 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
19f80 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
19f90 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
19fa0 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
19fb0 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 2d  pGroupBy;.    p-
19fc0 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  >isDistinct = 0;
19fd0 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20  .    isDistinct 
19fe0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
19ff0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
1a000 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
1a010 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67  hen this sorting
1a020 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68  .  ** index migh
1a030 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75  t end up being u
1a040 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74  nused if the dat
1a050 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65  a can be .  ** e
1a060 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d  xtracted in pre-
1a070 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49  sorted order.  I
1a080 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
1a090 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  se, then the.  *
1a0a0 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  * OP_OpenEphemer
1a0b0 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  al instruction w
1a0c0 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74  ill be changed t
1a0d0 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63  o an OP_Noop onc
1a0e0 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65  e.  ** we figure
1a0f0 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f   out that the so
1a100 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e  rting index is n
1a110 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20  ot needed.  The 
1a120 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20  addrSortIndex.  
1a130 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  ** variable is u
1a140 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74  sed to facilitat
1a150 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20  e that change.. 
1a160 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
1a170 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  By ){.    KeyInf
1a180 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
1a190 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1a1a0 72 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  r ){.      goto 
1a1b0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
1a1c0 7d 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  }.    pKeyInfo =
1a1d0 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
1a1e0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72  List(pParse, pOr
1a1f0 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64  derBy);.    pOrd
1a200 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d  erBy->iECursor =
1a210 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
1a220 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e  .    p->addrOpen
1a230 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f  Ephm[2] = addrSo
1a240 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20  rtIndex =.      
1a250 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a260 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
1a270 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20  meral,.         
1a280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a290 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
1a2a0 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e  rsor, pOrderBy->
1a2b0 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20  nExpr+2, 0,.    
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2d0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
1a2e0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
1a2f0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d  FO_HANDOFF);.  }
1a300 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 53 6f  else{.    addrSo
1a310 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20  rtIndex = -1;.  
1a320 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  }..  /* If the o
1a330 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65  utput is destine
1a340 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  d for a temporar
1a350 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68  y table, open th
1a360 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  at table..  */. 
1a370 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
1a380 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
1a390 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1a3a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
1a3b0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44  penEphemeral, pD
1a3c0 65 73 74 2d 3e 69 50 61 72 6d 2c 20 70 45 4c 69  est->iParm, pELi
1a3d0 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a  st->nExpr);.  }.
1a3e0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69  .  /* Set the li
1a3f0 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45  miter..  */.  iE
1a400 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
1a410 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1a420 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
1a430 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
1a440 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70   iEnd);..  /* Op
1a450 65 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  en a virtual ind
1a460 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  ex to use for th
1a470 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a  e distinct set..
1a480 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73    */.  if( isDis
1a490 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65 79  tinct ){.    Key
1a4a0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
1a4b0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 41 67      assert( isAg
1a4c0 67 20 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 3b  g || pGroupBy );
1a4d0 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20  .    distinct = 
1a4e0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
1a4f0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
1a500 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
1a510 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  st(pParse, p->pE
1a520 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
1a530 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1a540 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1a550 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 2c 20 30  , distinct, 0, 0
1a560 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a570 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
1a580 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
1a590 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
1a5a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73    }else{.    dis
1a5b0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a  tinct = -1;.  }.
1a5c0 0a 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20  .  /* Aggregate 
1a5d0 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74  and non-aggregat
1a5e0 65 20 71 75 65 72 69 65 73 20 61 72 65 20 68 61  e queries are ha
1a5f0 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c  ndled differentl
1a600 79 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67  y */.  if( !isAg
1a610 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30  g && pGroupBy==0
1a620 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1a630 63 61 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d  case is for non-
1a640 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
1a650 73 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 74  s.    ** Begin t
1a660 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
1a670 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e  .    */.    pWIn
1a680 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
1a690 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
1a6a0 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
1a6b0 20 26 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a   &pOrderBy, 0);.
1a6c0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
1a6d0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
1a6e0 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  end;..    /* If 
1a6f0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
1a700 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62  at was created b
1a710 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65  y a prior OP_Ope
1a720 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20  nEphemeral .    
1a730 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65  ** instruction e
1a740 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e  nded up not bein
1a750 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63  g needed, then c
1a760 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65  hange the OP_Ope
1a770 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a  nEphemeral.    *
1a780 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  * into an OP_Noo
1a790 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
1a7a0 28 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  ( addrSortIndex>
1a7b0 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d  =0 && pOrderBy==
1a7c0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1a7d0 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
1a7e0 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e  op(v, addrSortIn
1a7f0 64 65 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 70  dex, 1);.      p
1a800 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
1a810 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20  ] = -1;.    }.. 
1a820 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74     /* Use the st
1a830 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f  andard inner loo
1a840 70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  p.    */.    ass
1a850 65 72 74 28 21 69 73 44 69 73 74 69 6e 63 74 29  ert(!isDistinct)
1a860 3b 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74  ;.    if( select
1a870 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
1a880 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20  , p, pEList, 0, 
1a890 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c  0, pOrderBy, -1,
1a8a0 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
1a8b0 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
1a8c0 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70  fo->iContinue, p
1a8d0 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 61  WInfo->iBreak, a
1a8e0 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 67 6f  ff) ){.       go
1a8f0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
1a900 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 64     }..    /* End
1a910 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1a920 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
1a930 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1a940 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  End(pWInfo);.  }
1a950 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
1a960 73 20 69 73 20 74 68 65 20 70 72 6f 63 65 73 73  s is the process
1a970 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
1a980 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20  e queries */.   
1a990 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
1a9a0 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  ;    /* Name con
1a9b0 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73  text for process
1a9c0 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e  ing aggregate in
1a9d0 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
1a9e0 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20   int iAMem;     
1a9f0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
1aa00 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74  m address for st
1aa10 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52  oring current GR
1aa20 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
1aa30 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iBMem;        
1aa40 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
1aa50 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69  ddress for previ
1aa60 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ous GROUP BY */.
1aa70 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67      int iUseFlag
1aa80 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ;       /* Mem a
1aa90 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66  ddress holding f
1aaa0 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74  lag indicating t
1aab0 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20  hat at least.   
1aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aad0 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20       ** one row 
1aae0 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20  of the input to 
1aaf0 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68  the aggregator h
1ab00 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  as been.        
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ** processed */.
1ab30 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c      int iAbortFl
1ab40 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ag;     /* Mem a
1ab50 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75  ddress which cau
1ab60 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20  ses query abort 
1ab70 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20  if positive */. 
1ab80 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f     int groupBySo
1ab90 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63  rt;    /* Rows c
1aba0 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20  ome from source 
1abb0 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
1abc0 72 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 20 54 68  r */...    /* Th
1abd0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
1abe0 61 62 6c 65 73 20 68 6f 6c 64 20 61 64 64 72 65  ables hold addre
1abf0 73 73 65 73 20 6f 72 20 6c 61 62 65 6c 73 20 66  sses or labels f
1ac00 6f 72 20 70 61 72 74 73 20 6f 66 20 74 68 65 0a  or parts of the.
1ac10 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d      ** virtual m
1ac20 61 63 68 69 6e 65 20 70 72 6f 67 72 61 6d 20 77  achine program w
1ac30 65 20 61 72 65 20 70 75 74 74 69 6e 67 20 74 6f  e are putting to
1ac40 67 65 74 68 65 72 20 2a 2f 0a 20 20 20 20 69 6e  gether */.    in
1ac50 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b  t addrOutputRow;
1ac60 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
1ac70 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  f subroutine tha
1ac80 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75  t outputs a resu
1ac90 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e  lt row */.    in
1aca0 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20  t addrSetAbort; 
1acb0 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65        /* Set the
1acc0 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20   abort flag and 
1acd0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 69 6e  return */.    in
1ace0 74 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65  t addrInitialize
1acf0 4c 6f 6f 70 3b 20 2f 2a 20 53 74 61 72 74 20 6f  Loop; /* Start o
1ad00 66 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74  f code that init
1ad10 69 61 6c 69 7a 65 73 20 74 68 65 20 69 6e 70 75  ializes the inpu
1ad20 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e  t loop */.    in
1ad30 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b  t addrTopOfLoop;
1ad40 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
1ad50 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a  the input loop *
1ad60 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 47 72  /.    int addrGr
1ad70 6f 75 70 42 79 43 68 61 6e 67 65 3b 20 20 2f 2a  oupByChange;  /*
1ad80 20 43 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   Code that runs 
1ad90 77 68 65 6e 20 61 6e 79 20 47 52 4f 55 50 20 42  when any GROUP B
1ada0 59 20 74 65 72 6d 20 63 68 61 6e 67 65 73 20 2a  Y term changes *
1adb0 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 50 72  /.    int addrPr
1adc0 6f 63 65 73 73 52 6f 77 3b 20 20 20 20 20 2f 2a  ocessRow;     /*
1add0 20 43 6f 64 65 20 74 6f 20 70 72 6f 63 65 73 73   Code to process
1ade0 20 61 20 73 69 6e 67 6c 65 20 69 6e 70 75 74 20   a single input 
1adf0 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  row */.    int a
1ae00 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 20  ddrEnd;         
1ae10 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 61 6c 6c     /* End of all
1ae20 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20   processing */. 
1ae30 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69     int addrSorti
1ae40 6e 67 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68  ngIdx;     /* Th
1ae50 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
1ae60 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69  al for the sorti
1ae70 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ng index */.    
1ae80 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20  int addrReset;  
1ae90 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f          /* Subro
1aea0 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74  utine for resett
1aeb0 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
1aec0 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 61 64 64 72  tor */..    addr
1aed0 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
1aee0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
1aef0 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54      /* Convert T
1af00 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69  K_COLUMN nodes i
1af10 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  nto TK_AGG_COLUM
1af20 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69  N and make entri
1af30 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67  es in.    ** sAg
1af40 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b  gInfo for all TK
1af50 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f  _AGG_FUNCTION no
1af60 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  des in expressio
1af70 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ns of the.    **
1af80 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1af90 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65  t..    */.    me
1afa0 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
1afb0 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
1afc0 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
1afd0 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  rse;.    sNC.pSr
1afe0 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
1aff0 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e  ;.    sNC.pAggIn
1b000 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a  fo = &sAggInfo;.
1b010 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f      sAggInfo.nSo
1b020 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47  rtingColumn = pG
1b030 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42  roupBy ? pGroupB
1b040 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a  y->nExpr+1 : 0;.
1b050 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72      sAggInfo.pGr
1b060 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
1b070 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1b080 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
1b090 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
1b0a0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
1b0b0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
1b0c0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
1b0d0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
1b0e0 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72  ist(&sNC, pOrder
1b0f0 42 79 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  By) ){.      got
1b100 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1b110 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76    }.    if( pHav
1b120 69 6e 67 20 26 26 20 73 71 6c 69 74 65 33 45 78  ing && sqlite3Ex
1b130 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
1b140 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e  tes(&sNC, pHavin
1b150 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  g) ){.      goto
1b160 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
1b170 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   }.    sAggInfo.
1b180 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73  nAccumulator = s
1b190 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
1b1a0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1b1b0 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20  sAggInfo.nFunc; 
1b1c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
1b1d0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
1b1e0 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
1b1f0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
1b200 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 20  ].pExpr->pList) 
1b210 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1b220 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
1b230 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1b240 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1b250 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
1b260 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72  _end;..    /* Pr
1b270 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67  ocessing for agg
1b280 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f  regates with GRO
1b290 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69  UP BY is very di
1b2a0 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20  fferent and.    
1b2b0 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d  ** much more com
1b2c0 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67  plex than aggreg
1b2d0 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47  ates without a G
1b2e0 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a  ROUP BY..    */.
1b2f0 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
1b300 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   ){.      KeyInf
1b310 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a  o *pKeyInfo;  /*
1b320 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74   Keying informat
1b330 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75  ion for the grou
1b340 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a  p by clause */..
1b350 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
1b360 6c 61 62 65 6c 73 20 74 68 61 74 20 77 65 20 77  labels that we w
1b370 69 6c 6c 20 62 65 20 6e 65 65 64 69 6e 67 0a 20  ill be needing. 
1b380 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 0a 20 20       */.     .  
1b390 20 20 20 20 61 64 64 72 49 6e 69 74 69 61 6c 69      addrInitiali
1b3a0 7a 65 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  zeLoop = sqlite3
1b3b0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1b3c0 3b 0a 20 20 20 20 20 20 61 64 64 72 47 72 6f 75  ;.      addrGrou
1b3d0 70 42 79 43 68 61 6e 67 65 20 3d 20 73 71 6c 69  pByChange = sqli
1b3e0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1b3f0 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72 50  (v);.      addrP
1b400 72 6f 63 65 73 73 52 6f 77 20 3d 20 73 71 6c 69  rocessRow = sqli
1b410 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1b420 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  (v);..      /* I
1b430 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f  f there is a GRO
1b440 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20  UP BY clause we 
1b450 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72  might need a sor
1b460 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20  ting index to.  
1b470 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74      ** implement
1b480 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74   it.  Allocate t
1b490 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  hat sorting inde
1b4a0 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75  x now.  If it tu
1b4b0 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a  rns out.      **
1b4c0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
1b4d0 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c  need it after al
1b4e0 6c 2c 20 74 68 65 20 4f 70 65 6e 45 70 68 65 6d  l, the OpenEphem
1b4f0 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
1b500 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  .      ** will b
1b510 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
1b520 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20   a Noop.  .     
1b530 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e   */.      sAggIn
1b540 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20  fo.sortingIdx = 
1b550 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
1b560 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
1b570 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
1b580 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
1b590 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64  oupBy);.      ad
1b5a0 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 0a 20  drSortingIdx =. 
1b5b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b5c0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1b5d0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
1b5e0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
1b5f0 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Idx,.           
1b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 41                sA
1b610 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
1b620 6f 6c 75 6d 6e 2c 20 30 2c 0a 20 20 20 20 20 20  olumn, 0,.      
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b640 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
1b650 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
1b660 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20  ANDOFF);..      
1b670 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  /* Initialize me
1b680 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75  mory locations u
1b690 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20  sed by GROUP BY 
1b6a0 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73  aggregate proces
1b6b0 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sing.      */.  
1b6c0 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b      iUseFlag = +
1b6d0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1b6e0 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20       iAbortFlag 
1b6f0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1b700 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20  ;.      iAMem = 
1b710 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
1b720 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
1b730 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
1b740 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->nExpr;.      i
1b750 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  BMem = pParse->n
1b760 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
1b770 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
1b780 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
1b790 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b7a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1b7b0 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74  teger, 0, iAbort
1b7c0 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
1b7d0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c  eComment((v, "cl
1b7e0 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29  ear abort flag")
1b7f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b800 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b810 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73  _Integer, 0, iUs
1b820 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
1b830 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
1b840 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61  ndicate accumula
1b850 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20  tor empty"));.  
1b860 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b870 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1b880 2c 20 30 2c 20 61 64 64 72 49 6e 69 74 69 61 6c  , 0, addrInitial
1b890 69 7a 65 4c 6f 6f 70 29 3b 0a 0a 20 20 20 20 20  izeLoop);..     
1b8a0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1b8b0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
1b8c0 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20  utputs a single 
1b8d0 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
1b8e0 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20  t.      ** set. 
1b8f0 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   This subroutine
1b900 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20   first looks at 
1b910 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49  the iUseFlag.  I
1b920 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20  f iUseFlag.     
1b930 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e   ** is less than
1b940 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
1b950 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  o, the subroutin
1b960 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
1b970 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70  f.      ** the p
1b980 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20  rocessing calls 
1b990 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f  for the query to
1b9a0 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62   abort, this sub
1b9b0 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
1b9c0 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
1b9d0 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72  iAbortFlag memor
1b9e0 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72  y location befor
1b9f0 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20  e returning in. 
1ba00 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f       ** order to
1ba10 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c   signal the call
1ba20 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20  er to abort..   
1ba30 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
1ba40 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74  SetAbort = sqlit
1ba50 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1ba60 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
1ba70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ba80 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
1ba90 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
1baa0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1bab0 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c  v, "set abort fl
1bac0 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
1bad0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1bae0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20  , OP_Return, 0, 
1baf0 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  0);.      addrOu
1bb00 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
1bb10 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1bb20 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
1bb30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1bb40 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c  OP_IfPos, iUseFl
1bb50 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ag, addrOutputRo
1bb60 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65  w+2);.      Vdbe
1bb70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f  Comment((v, "Gro
1bb80 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
1bb90 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e  rator entry poin
1bba0 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t"));.      sqli
1bbb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1bbc0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30   OP_Return, 0, 0
1bbd0 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
1bbe0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
1bbf0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
1bc00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 61 76  ;.      if( pHav
1bc10 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
1bc20 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1bc30 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
1bc40 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
1bc50 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  +1, SQLITE_JUMPI
1bc60 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
1bc70 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63        rc = selec
1bc80 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
1bc90 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
1bca0 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
1bcb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bcc0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
1bcd0 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20  inct, pDest,.   
1bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcf0 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70          addrOutp
1bd00 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74  utRow+1, addrSet
1bd10 41 62 6f 72 74 2c 20 61 66 66 29 3b 0a 20 20 20  Abort, aff);.   
1bd20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1bd30 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
1bd40 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
1bd50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bd60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp2(v, OP_Retu
1bd70 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  rn, 0, 0);.     
1bd80 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1bd90 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65   "end groupby re
1bda0 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29  sult generator")
1bdb0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
1bdc0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
1bdd0 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73  ne that will res
1bde0 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20  et the group-by 
1bdf0 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20  accumulator.    
1be00 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 52    */.      addrR
1be10 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64  eset = sqlite3Vd
1be20 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1be30 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63  ;.      resetAcc
1be40 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
1be50 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
1be60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1be70 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp2(v, OP_Retur
1be80 6e 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 20  n, 0, 0);..     
1be90 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70   /* Begin a loop
1bea0 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
1beb0 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f  ct all source ro
1bec0 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ws in GROUP BY o
1bed0 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rder..      ** T
1bee0 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76  his might involv
1bef0 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c  e two separate l
1bf00 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f  oops with an OP_
1bf10 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c  Sort in between,
1bf20 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   or.      ** it 
1bf30 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c  might be a singl
1bf40 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73  e loop that uses
1bf50 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74   an index to ext
1bf60 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ract information
1bf70 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  .      ** in the
1bf80 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20   right order to 
1bf90 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20  begin with..    
1bfa0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
1bfb0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1bfc0 65 6c 28 76 2c 20 61 64 64 72 49 6e 69 74 69 61  el(v, addrInitia
1bfd0 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  lizeLoop);.     
1bfe0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bff0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1c000 30 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  0, addrReset);. 
1c010 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
1c020 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1c030 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
1c040 2c 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75  , pWhere, &pGrou
1c050 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  pBy, 0);.      i
1c060 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
1c070 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
1c080 20 20 20 20 20 20 69 66 28 20 70 47 72 6f 75 70        if( pGroup
1c090 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  By==0 ){.       
1c0a0 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65   /* The optimize
1c0b0 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c  r is able to del
1c0c0 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f  iver rows in gro
1c0d0 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20  up by order so. 
1c0e0 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20         ** we do 
1c0f0 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74  not have to sort
1c100 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  .  The OP_OpenEp
1c110 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
1c120 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
1c130 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72   cancelled later
1c140 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c   because we stil
1c150 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68  l need to use th
1c160 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20  e pKeyInfo.     
1c170 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 47     */.        pG
1c180 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
1c190 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 67 72  upBy;.        gr
1c1a0 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20  oupBySort = 0;. 
1c1b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c1c0 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20      /* Rows are 
1c1d0 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e  coming out in un
1c1e0 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72  determined order
1c1f0 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75  .  We have to pu
1c200 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61  sh.        ** ea
1c210 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f  ch row into a so
1c220 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72  rting index, ter
1c230 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74  minate the first
1c240 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a   loop,.        *
1c250 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72  * then loop over
1c260 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
1c270 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ex in order to g
1c280 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  et the output.  
1c290 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74        ** in sort
1c2a0 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  ed order.       
1c2b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
1c2c0 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
1c2d0 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a   int regRecord;.
1c2e0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
1c2f0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47  ;.        int nG
1c300 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20  roupBy;..       
1c310 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31   groupBySort = 1
1c320 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70  ;.        nGroup
1c330 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  By = pGroupBy->n
1c340 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43  Expr;.        nC
1c350 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20  ol = nGroupBy + 
1c360 31 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  1;.        j = n
1c370 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20  GroupBy+1;.     
1c380 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
1c390 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
1c3a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1c3b0 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f  if( sAggInfo.aCo
1c3c0 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75  l[i].iSorterColu
1c3d0 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  mn>=j ){.       
1c3e0 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20       nCol++;.   
1c3f0 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
1c400 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c410 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42    }.        regB
1c420 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ase = sqlite3Get
1c430 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
1c440 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
1c450 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c460 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1c470 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61   pGroupBy, regBa
1c480 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
1c490 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1c4a0 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 73  , OP_Sequence, s
1c4b0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
1c4c0 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72 6f 75  dx,regBase+nGrou
1c4d0 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20 6a 20  pBy);.        j 
1c4e0 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20  = nGroupBy+1;.  
1c4f0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1c500 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d  <sAggInfo.nColum
1c510 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
1c520 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
1c530 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73  o_col *pCol = &s
1c540 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b  AggInfo.aCol[i];
1c550 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1c560 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
1c570 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  mn>=j ){.       
1c580 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1c590 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 76 2c  CodeGetColumn(v,
1c5a0 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f   pCol->pTab, pCo
1c5b0 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c  l->iColumn, pCol
1c5c0 2d 3e 69 54 61 62 6c 65 2c 0a 20 20 20 20 20 20  ->iTable,.      
1c5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a                 j
1c5f0 20 2b 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20   + regBase);.   
1c600 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
1c610 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c620 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52    }.        regR
1c630 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
1c640 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
1c650 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1c660 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1c670 4f 50 5f 52 65 67 4d 61 6b 65 52 65 63 2c 20 72  OP_RegMakeRec, r
1c680 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65  egBase, nCol, re
1c690 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
1c6a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c6b0 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
1c6c0 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ert, sAggInfo.so
1c6d0 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63  rtingIdx, regRec
1c6e0 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
1c6f0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1c700 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
1c710 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
1c720 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1c730 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1c740 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a  regBase, nCol);.
1c750 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
1c760 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
1c770 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c780 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1c790 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  _Sort, sAggInfo.
1c7a0 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
1c7b0 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64  End);.        Vd
1c7c0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
1c7d0 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b  ROUP BY sort"));
1c7e0 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
1c7f0 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  o.useSortingIdx 
1c800 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 1;.      }..  
1c810 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
1c820 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
1c830 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73  P BY terms and s
1c840 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20  tore in b0, b1, 
1c850 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28  b2....      ** (
1c860 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63  b0 is memory loc
1c870 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62  ation iBMem+0, b
1c880 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e  1 is iBMem+1, an
1c890 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20  d so forth).    
1c8a0 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72    ** Then compar
1c8b0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
1c8c0 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61  OUP BY terms aga
1c8d0 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42  inst the GROUP B
1c8e0 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a  Y terms.      **
1c8f0 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
1c900 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  us row currently
1c910 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61   stored in a0, a
1c920 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, a2....      *
1c930 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f  /.      addrTopO
1c940 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
1c950 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1c960 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
1c970 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; j<pGroupBy->nE
1c980 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
1c990 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
1c9a0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rt ){.          
1c9b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c9c0 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
1c9d0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
1c9e0 49 64 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29  Idx, j, iBMem+j)
1c9f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1ca00 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
1ca10 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d  nfo.directMode =
1ca20 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   1;.          sq
1ca30 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1ca40 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
1ca50 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65  a[j].pExpr, iBMe
1ca60 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  m+j);.        }.
1ca70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
1ca80 72 28 6a 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45  r(j=pGroupBy->nE
1ca90 78 70 72 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  xpr-1; j>=0; j--
1caa0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  ){.        if( j
1cab0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1cac0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cad0 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 69 41 4d  p3(v, OP_Eq, iAM
1cae0 65 6d 2b 6a 2c 20 61 64 64 72 50 72 6f 63 65 73  em+j, addrProces
1caf0 73 52 6f 77 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  sRow, iBMem+j);.
1cb00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1cb10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1cb20 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1cb30 5f 4e 65 2c 20 69 41 4d 65 6d 2b 6a 2c 20 61 64  _Ne, iAMem+j, ad
1cb40 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 2c  drGroupByChange,
1cb50 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
1cb60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
1cb70 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1cb80 28 76 2c 20 2d 31 2c 20 28 76 6f 69 64 2a 29 70  (v, -1, (void*)p
1cb90 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a  KeyInfo->aColl[j
1cba0 5d 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  ], P4_COLLSEQ);.
1cbb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1cbc0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
1cbd0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 55 41 4c 29  QLITE_NULLEQUAL)
1cbe0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1cbf0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1cc00 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e  e that runs when
1cc10 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42  ever the GROUP B
1cc20 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20  Y changes..     
1cc30 20 2a 2a 20 43 68 61 6e 67 65 20 69 6e 20 74 68   ** Change in th
1cc40 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64  e GROUP BY are d
1cc50 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70  etected by the p
1cc60 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20  revious code.   
1cc70 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66     ** block.  If
1cc80 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63   there were no c
1cc90 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f  hanges, this blo
1cca0 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20  ck is skipped.. 
1ccb0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1ccc0 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65   This code copie
1ccd0 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20  s current group 
1cce0 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62  by terms in b0,b
1ccf0 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a  1,b2,....      *
1cd00 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c  * over to a0,a1,
1cd10 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c  a2.  It then cal
1cd20 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  ls the output su
1cd30 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
1cd40 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65  * and resets the
1cd50 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
1cd60 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
1cd70 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a   in preparation.
1cd80 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
1cd90 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62   next GROUP BY b
1cda0 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atch..      */. 
1cdb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1cdc0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1cdd0 61 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67  addrGroupByChang
1cde0 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  e);.      for(j=
1cdf0 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
1ce00 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
1ce10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ce20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 6f 76 65  ddOp2(v, OP_Move
1ce30 2c 20 69 42 4d 65 6d 2b 6a 2c 20 69 41 4d 65 6d  , iBMem+j, iAMem
1ce40 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
1ce50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ce60 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1ce70 2c 20 30 2c 20 61 64 64 72 4f 75 74 70 75 74 52  , 0, addrOutputR
1ce80 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
1ce90 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
1cea0 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20  ut one row"));. 
1ceb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1cec0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
1ced0 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20  os, iAbortFlag, 
1cee0 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
1cef0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1cf00 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61  "check abort fla
1cf10 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
1cf20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1cf30 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64   OP_Gosub, 0, ad
1cf40 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
1cf50 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1cf60 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74  "reset accumulat
1cf70 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
1cf80 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72   Update the aggr
1cf90 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
1cfa0 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  rs based on the 
1cfb0 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20  content of.     
1cfc0 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
1cfd0 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  row.      */.   
1cfe0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1cff0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
1d000 64 72 50 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20  drProcessRow);. 
1d010 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
1d020 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
1d030 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
1d040 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d050 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1d060 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 1, iUseFlag);.
1d070 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1d080 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
1d090 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61  data in accumula
1d0a0 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
1d0b0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
1d0c0 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  p.      */.     
1d0d0 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
1d0e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1d0f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d100 20 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e   OP_Next, sAggIn
1d110 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
1d120 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20  ddrTopOfLoop);. 
1d130 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d140 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1d150 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
1d160 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d170 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
1d180 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20  addrSortingIdx, 
1d190 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
1d1a0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65     /* Output the
1d1b0 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65   final row of re
1d1c0 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sult.      */.  
1d1d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d1e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1d1f0 62 2c 20 30 2c 20 61 64 64 72 4f 75 74 70 75 74  b, 0, addrOutput
1d200 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
1d210 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74  Comment((v, "out
1d220 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29  put final row"))
1d230 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 20 2f  ;.      .    } /
1d240 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79  * endif pGroupBy
1d250 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20   */.    else {. 
1d260 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
1d270 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20  MinMax = 0;.    
1d280 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c    ExprList *pDel
1d290 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 38 20 66   = 0;.      u8 f
1d2a0 6c 61 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  lag;..      /* C
1d2b0 68 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72  heck if the quer
1d2c0 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74  y is of one of t
1d2d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
1d2e0 6d 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ms:.      **.   
1d2f0 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d     **   SELECT m
1d300 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20  in(x) FROM .... 
1d310 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
1d320 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e   max(x) FROM ...
1d330 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1d340 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  ** If it is, the
1d350 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69  n ask the code i
1d360 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74  n where.c to att
1d370 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73  empt to sort res
1d380 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 61 73  ults.      ** as
1d390 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   if there was an
1d3a0 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72   "ORDER ON x" or
1d3b0 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53   "ORDER ON x DES
1d3c0 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20  C" clause. .    
1d3d0 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20    ** If where.c 
1d3e0 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75  is able to produ
1d3f0 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65  ce results sorte
1d400 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c  d in this order,
1d410 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61   then.      ** a
1d420 64 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20  dd vdbe code to 
1d430 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
1d440 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70   processing loop
1d450 20 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20   after the .    
1d460 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61    ** first itera
1d470 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20  tion (since the 
1d480 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
1d490 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a  of the loop is .
1d4a0 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74        ** guarant
1d4b0 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  eed to operate o
1d4c0 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74  n the row with t
1d4d0 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61  he minimum or ma
1d4e0 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 2a 2a 20  ximum .      ** 
1d4f0 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20  value of x, the 
1d500 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65  only row require
1d510 64 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  d)..      **.   
1d520 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20     ** A special 
1d530 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73  flag must be pas
1d540 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
1d550 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c  ereBegin() to sl
1d560 69 67 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20  ightly.      ** 
1d570 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 75 72  modify behaviour
1d580 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
1d590 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
1d5a0 20 2b 20 49 66 20 74 68 65 20 71 75 65 72 79 20   + If the query 
1d5b0 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e  is a "SELECT min
1d5c0 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c  (x)", then the l
1d5d0 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20  oop coded by.   
1d5e0 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e     **     where.
1d5f0 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65  c should not ite
1d600 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61  rate over any va
1d610 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c  lues with a NULL
1d620 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20   value.      ** 
1d630 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20      for x..     
1d640 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 2b   **.      **   +
1d650 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63   The optimizer c
1d660 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28  ode in where.c (
1d670 74 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64  the thing that d
1d680 65 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20  ecides which.   
1d690 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20     **     index 
1d6a0 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73  or indices to us
1d6b0 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20  e) should place 
1d6c0 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f  a different prio
1d6d0 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 2a  rity on .      *
1d6e0 2a 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67  *     satisfying
1d6f0 20 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20   the 'ORDER BY' 
1d700 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64  clause than it d
1d710 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73  oes in other cas
1d720 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  es..      **    
1d730 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61   Refer to code a
1d740 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77  nd comments in w
1d750 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69  here.c for detai
1d760 6c 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ls..      */.   
1d770 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78     flag = minMax
1d780 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 29  Query(pParse, p)
1d790 3b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67  ;.      if( flag
1d7a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 6c   ){.        pDel
1d7b0 20 3d 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c   = pMinMax = sql
1d7c0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
1d7d0 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  db, p->pEList->a
1d7e0 5b 30 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74  [0].pExpr->pList
1d7f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1d800 4d 69 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d  MinMax && !db->m
1d810 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1d820 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
1d830 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
1d840 20 3d 20 28 28 66 6c 61 67 3d 3d 4f 52 44 45 52   = ((flag==ORDER
1d850 42 59 5f 4d 49 4e 29 3f 30 3a 31 29 3b 0a 20 20  BY_MIN)?0:1);.  
1d860 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d          pMinMax-
1d870 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20  >a[0].pExpr->op 
1d880 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
1d890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
1d8a0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
1d8b0 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61  se runs if the a
1d8c0 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20  ggregate has no 
1d8d0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
1d8e0 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 70    The.      ** p
1d8f0 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63  rocessing is muc
1d900 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20  h simpler since 
1d910 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20  there is only a 
1d920 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20  single row.     
1d930 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20   ** of output.. 
1d940 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
1d950 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
1d960 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
1d970 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
1d980 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
1d990 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
1d9a0 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70  List, pWhere, &p
1d9b0 4d 69 6e 4d 61 78 2c 20 66 6c 61 67 29 3b 0a 20  MinMax, flag);. 
1d9c0 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d       if( pWInfo=
1d9d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
1d9e0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
1d9f0 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 20 20 20  ete(pDel);.     
1da00 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
1da10 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
1da20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
1da30 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
1da40 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  gInfo);.      if
1da50 28 20 21 70 4d 69 6e 4d 61 78 20 26 26 20 66 6c  ( !pMinMax && fl
1da60 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ag ){.        sq
1da70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1da80 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
1da90 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a  WInfo->iBreak);.
1daa0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
1dab0 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79  ent((v, "%s() by
1dac0 20 69 6e 64 65 78 22 2c 20 28 66 6c 61 67 3d 3d   index", (flag==
1dad0 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e  ORDERBY_MIN?"min
1dae0 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20  ":"max")));.    
1daf0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1db00 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
1db10 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
1db20 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
1db30 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
1db40 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ;.      pOrderBy
1db50 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
1db60 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
1db70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1db80 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
1db90 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20  aving, addrEnd, 
1dba0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1dbb0 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  L);.      }.    
1dbc0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
1dbd0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
1dbe0 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c  pEList, 0, 0, 0,
1dbf0 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20   -1, .          
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73              pDes
1dc10 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72  t, addrEnd, addr
1dc20 45 6e 64 2c 20 61 66 66 29 3b 0a 0a 20 20 20 20  End, aff);..    
1dc30 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
1dc40 74 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20  tDelete(pDel);. 
1dc50 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1dc60 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1dc70 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  (v, addrEnd);.  
1dc80 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20    .  } /* endif 
1dc90 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
1dca0 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  */..  /* If ther
1dcb0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
1dcc0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65   clause, then we
1dcd0 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68   need to sort th
1dce0 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61  e results.  ** a
1dcf0 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20  nd send them to 
1dd00 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65  the callback one
1dd10 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   by one..  */.  
1dd20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
1dd30 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
1dd40 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20  Tail(pParse, p, 
1dd50 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  v, pEList->nExpr
1dd60 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 23  , pDest);.  }..#
1dd70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1dd80 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 2f 2a  IT_SUBQUERY.  /*
1dd90 20 49 66 20 74 68 69 73 20 77 61 73 20 61 20 73   If this was a s
1dda0 75 62 71 75 65 72 79 2c 20 77 65 20 68 61 76 65  ubquery, we have
1ddb0 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64 20 74   now converted t
1ddc0 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
1ddd0 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72   a.  ** temporar
1dde0 79 20 74 61 62 6c 65 2e 20 20 53 6f 20 73 65 74  y table.  So set
1ddf0 20 74 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65   the SrcList_ite
1de00 6d 2e 69 73 50 6f 70 75 6c 61 74 65 64 20 66 6c  m.isPopulated fl
1de10 61 67 20 74 6f 20 70 72 65 76 65 6e 74 0a 20 20  ag to prevent.  
1de20 2a 2a 20 74 68 69 73 20 73 75 62 71 75 65 72 79  ** this subquery
1de30 20 66 72 6f 6d 20 62 65 69 6e 67 20 65 76 61 6c   from being eval
1de40 75 61 74 65 64 20 61 67 61 69 6e 20 61 6e 64 20  uated again and 
1de50 74 6f 20 66 6f 72 63 65 20 74 68 65 20 75 73 65  to force the use
1de60 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 74 65 6d   of.  ** the tem
1de70 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a 20 20  porary table..  
1de80 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  */.  if( pParent
1de90 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1dea0 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e  pParent->pSrc->n
1deb0 53 72 63 3e 70 61 72 65 6e 74 54 61 62 20 29 3b  Src>parentTab );
1dec0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1ded0 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61  rent->pSrc->a[pa
1dee0 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74  rentTab].pSelect
1def0 3d 3d 70 20 29 3b 0a 20 20 20 20 70 50 61 72 65  ==p );.    pPare
1df00 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65  nt->pSrc->a[pare
1df10 6e 74 54 61 62 5d 2e 69 73 50 6f 70 75 6c 61 74  ntTab].isPopulat
1df20 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64  ed = 1;.  }.#end
1df30 69 66 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  if..  /* Jump he
1df40 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20  re to skip this 
1df50 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
1df60 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1df70 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a  abel(v, iEnd);..
1df80 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
1df90 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
1dfa0 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68   coded.   Set th
1dfb0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  e return code to
1dfc0 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63   0.  ** to indic
1dfd0 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20  ate no errors.. 
1dfe0 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20   */.  rc = 0;.. 
1dff0 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70   /* Control jump
1e000 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20  s to here if an 
1e010 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
1e020 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75  ered above, or u
1e030 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  pon.  ** success
1e040 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68  ful coding of th
1e050 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73  e SELECT..  */.s
1e060 65 6c 65 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a  elect_end:..  /*
1e070 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e   Identify column
1e080 20 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c   names if we wil
1e090 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65 6d 20  l be using them 
1e0a0 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20  in a callback.  
1e0b0 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69  This.  ** step i
1e0c0 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
1e0d0 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67   output is going
1e0e0 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 64   to some other d
1e0f0 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f  estination..  */
1e100 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1e110 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65  E_OK && pDest->e
1e120 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
1e130 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ck ){.    genera
1e140 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
1e150 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
1e160 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
1e170 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 41 67  sqlite3_free(sAg
1e180 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73  gInfo.aCol);.  s
1e190 71 6c 69 74 65 33 5f 66 72 65 65 28 73 41 67 67  qlite3_free(sAgg
1e1a0 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72  Info.aFunc);.  r
1e1b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1e1c0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1e1d0 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a  DEBUG)./*.******
1e1e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e1f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e200 2a 2a 2a 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 0a 2a 2a 20 54 68 65  *********.** The
1e230 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
1e240 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
1e250 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
1e260 67 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 64  g only.  The cod
1e270 65 0a 2a 2a 20 74 68 61 74 20 66 6f 6c 6c 6f 77  e.** that follow
1e280 73 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61  s does not appea
1e290 72 20 69 6e 20 6e 6f 72 6d 61 6c 20 62 75 69 6c  r in normal buil
1e2a0 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ds..**.** These 
1e2b0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
1e2c0 64 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 74  d to print out t
1e2d0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6c  he content of al
1e2e0 6c 20 6f 72 20 70 61 72 74 20 6f 66 20 61 20 0a  l or part of a .
1e2f0 2a 2a 20 70 61 72 73 65 20 73 74 72 75 63 74 75  ** parse structu
1e300 72 65 73 20 73 75 63 68 20 61 73 20 53 65 6c 65  res such as Sele
1e310 63 74 20 6f 72 20 45 78 70 72 2e 20 20 53 75 63  ct or Expr.  Suc
1e320 68 20 70 72 69 6e 74 6f 75 74 73 20 61 72 65 20  h printouts are 
1e330 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 68 65  useful.** for he
1e340 6c 70 69 6e 67 20 74 6f 20 75 6e 64 65 72 73 74  lping to underst
1e350 61 6e 64 20 77 68 61 74 20 69 73 20 68 61 70 70  and what is happ
1e360 65 6e 69 6e 67 20 69 6e 73 69 64 65 20 74 68 65  ening inside the
1e370 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
1e380 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 65 78  ** during the ex
1e390 65 63 75 74 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c  ecution of compl
1e3a0 65 78 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ex SELECT statem
1e3b0 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  ents..**.** Thes
1e3c0 65 20 72 6f 75 74 69 6e 65 20 61 72 65 20 6e 6f  e routine are no
1e3d0 74 20 63 61 6c 6c 65 64 20 61 6e 79 77 68 65 72  t called anywher
1e3e0 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  e from within th
1e3f0 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 63 6f 64 65  e normal.** code
1e400 20 62 61 73 65 2e 20 20 54 68 65 6e 20 61 72 65   base.  Then are
1e410 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
1e420 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
1e430 69 6e 20 74 68 65 20 64 65 62 75 67 67 65 72 0a  in the debugger.
1e440 2a 2a 20 6f 72 20 66 72 6f 6d 20 74 65 6d 70 6f  ** or from tempo
1e450 72 61 72 79 20 22 70 72 69 6e 74 66 22 20 73 74  rary "printf" st
1e460 61 74 65 6d 65 6e 74 73 20 69 6e 73 65 72 74 65  atements inserte
1e470 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e  d for debugging.
1e480 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1e490 50 72 69 6e 74 45 78 70 72 28 45 78 70 72 20 2a  PrintExpr(Expr *
1e4a0 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b  p){.  if( p->tok
1e4b0 65 6e 2e 7a 20 26 26 20 70 2d 3e 74 6f 6b 65 6e  en.z && p->token
1e4c0 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  .n>0 ){.    sqli
1e4d0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1e4e0 28 25 2e 2a 73 22 2c 20 70 2d 3e 74 6f 6b 65 6e  (%.*s", p->token
1e4f0 2e 6e 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b  .n, p->token.z);
1e500 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1e510 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1e520 28 22 28 25 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a  ("(%d", p->op);.
1e530 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 65    }.  if( p->pLe
1e540 66 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ft ){.    sqlite
1e550 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 22  3DebugPrintf(" "
1e560 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
1e570 69 6e 74 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  intExpr(p->pLeft
1e580 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
1e590 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  pRight ){.    sq
1e5a0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1e5b0 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  (" ");.    sqlit
1e5c0 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70  e3PrintExpr(p->p
1e5d0 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 73 71  Right);.  }.  sq
1e5e0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1e5f0 28 22 29 22 29 3b 0a 7d 0a 76 6f 69 64 20 73 71  (")");.}.void sq
1e600 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69  lite3PrintExprLi
1e610 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  st(ExprList *pLi
1e620 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
1e630 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
1e640 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
1e650 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
1e660 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  xpr(pList->a[i].
1e670 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
1e680 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  i<pList->nExpr-1
1e690 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1e6a0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 20  3DebugPrintf(", 
1e6b0 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ");.    }.  }.}.
1e6c0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e  void sqlite3Prin
1e6d0 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a  tSelect(Select *
1e6e0 70 2c 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a  p, int indent){.
1e6f0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1e700 69 6e 74 66 28 22 25 2a 73 53 45 4c 45 43 54 28  intf("%*sSELECT(
1e710 25 70 29 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22  %p) ", indent, "
1e720 22 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ", p);.  sqlite3
1e730 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d  PrintExprList(p-
1e740 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  >pEList);.  sqli
1e750 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1e760 5c 6e 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  \n");.  if( p->p
1e770 53 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20  Src ){.    char 
1e780 2a 7a 50 72 65 66 69 78 3b 0a 20 20 20 20 69 6e  *zPrefix;.    in
1e790 74 20 69 3b 0a 20 20 20 20 7a 50 72 65 66 69 78  t i;.    zPrefix
1e7a0 20 3d 20 22 46 52 4f 4d 22 3b 0a 20 20 20 20 66   = "FROM";.    f
1e7b0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72  or(i=0; i<p->pSr
1e7c0 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
1e7d0 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
1e7e0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
1e7f0 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d  = &p->pSrc->a[i]
1e800 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
1e810 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
1e820 22 2c 20 69 6e 64 65 6e 74 2b 36 2c 20 7a 50 72  ", indent+6, zPr
1e830 65 66 69 78 29 3b 0a 20 20 20 20 20 20 7a 50 72  efix);.      zPr
1e840 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 20  efix = "";.     
1e850 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
1e860 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
1e870 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1e880 66 28 22 28 5c 6e 22 29 3b 0a 20 20 20 20 20 20  f("(\n");.      
1e890 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65    sqlite3PrintSe
1e8a0 6c 65 63 74 28 70 49 74 65 6d 2d 3e 70 53 65 6c  lect(pItem->pSel
1e8b0 65 63 74 2c 20 69 6e 64 65 6e 74 2b 31 30 29 3b  ect, indent+10);
1e8c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e8d0 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
1e8e0 29 22 2c 20 69 6e 64 65 6e 74 2b 38 2c 20 22 22  )", indent+8, ""
1e8f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1e900 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  f( pItem->zName 
1e910 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e920 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
1e930 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  s", pItem->zName
1e940 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e950 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62   if( pItem->pTab
1e960 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1e970 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1e980 28 74 61 62 6c 65 3a 20 25 73 29 22 2c 20 70 49  (table: %s)", pI
1e990 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
1e9a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e9b0 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
1e9c0 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  as ){.        sq
1e9d0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1e9e0 28 22 20 41 53 20 25 73 22 2c 20 70 49 74 65 6d  (" AS %s", pItem
1e9f0 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20  ->zAlias);.     
1ea00 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 70   }.      if( i<p
1ea10 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 2d 31 20 29  ->pSrc->nSrc-1 )
1ea20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ea30 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 22  3DebugPrintf(","
1ea40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ea50 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1ea60 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d  ntf("\n");.    }
1ea70 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57  .  }.  if( p->pW
1ea80 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  here ){.    sqli
1ea90 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1eaa0 25 2a 73 20 57 48 45 52 45 20 22 2c 20 69 6e 64  %*s WHERE ", ind
1eab0 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71  ent, "");.    sq
1eac0 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70  lite3PrintExpr(p
1ead0 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73  ->pWhere);.    s
1eae0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1eaf0 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69  f("\n");.  }.  i
1eb00 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  f( p->pGroupBy )
1eb10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
1eb20 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 47 52  ugPrintf("%*s GR
1eb30 4f 55 50 20 42 59 20 22 2c 20 69 6e 64 65 6e 74  OUP BY ", indent
1eb40 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  , "");.    sqlit
1eb50 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28  e3PrintExprList(
1eb60 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
1eb70 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1eb80 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a  intf("\n");.  }.
1eb90 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67    if( p->pHaving
1eba0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1ebb0 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
1ebc0 48 41 56 49 4e 47 20 22 2c 20 69 6e 64 65 6e 74  HAVING ", indent
1ebd0 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  , "");.    sqlit
1ebe0 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70  e3PrintExpr(p->p
1ebf0 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c  Having);.    sql
1ec00 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1ec10 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  "\n");.  }.  if(
1ec20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
1ec30 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1ec40 50 72 69 6e 74 66 28 22 25 2a 73 20 4f 52 44 45  Printf("%*s ORDE
1ec50 52 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20  R BY ", indent, 
1ec60 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "");.    sqlite3
1ec70 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d  PrintExprList(p-
1ec80 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
1ec90 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1eca0 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a  tf("\n");.  }.}.
1ecb0 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74  /* End of the st
1ecc0 72 75 63 74 75 72 65 20 64 65 62 75 67 20 70 72  ructure debug pr
1ecd0 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a  inting code.****
1ece0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ecf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ed00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a 23 65 6e 64 69  *********/.#endi
1ed30 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
1ed40 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
1ed50 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1ed60 47 29 20 2a 2f 0a                                G) */.