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

Artifact 394aa3542e8df599dcca77b0e75f7875760a13ad:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 34 31 32  select.c,v 1.412
0200: 20 32 30 30 38 2f 30 32 2f 30 36 20 32 33 3a 35   2008/02/06 23:5
0210: 32 3a 33 37 20 64 72 68 20 45 78 70 20 24 0a 2a  2:37 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
0250: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
0260: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 62 75  ect structure bu
0270: 74 20 64 6f 20 6e 6f 74 20 64 65 61 6c 6c 6f 63  t do not dealloc
0280: 61 74 65 0a 2a 2a 20 74 68 65 20 73 65 6c 65 63  ate.** the selec
0290: 74 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  t structure itse
02a0: 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  lf..*/.static vo
02b0: 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74 28 53  id clearSelect(S
02c0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c  elect *p){.  sql
02d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
02e0: 74 65 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  te(p->pEList);. 
02f0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
0300: 65 6c 65 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a  elete(p->pSrc);.
0310: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
0320: 65 74 65 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a  ete(p->pWhere);.
0330: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0340: 74 44 65 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75  tDelete(p->pGrou
0350: 70 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  pBy);.  sqlite3E
0360: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 48 61  xprDelete(p->pHa
0370: 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  ving);.  sqlite3
0380: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
0390: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73  ->pOrderBy);.  s
03a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
03b0: 74 65 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  te(p->pPrior);. 
03c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
03d0: 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  te(p->pLimit);. 
03e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
03f0: 74 65 28 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  te(p->pOffset);.
0400: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
0410: 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73 74  ize a SelectDest
0420: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76   structure..*/.v
0430: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0440: 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74  tDestInit(Select
0450: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74  Dest *pDest, int
0460: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
0470: 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65  m){.  pDest->eDe
0480: 73 74 20 3d 20 65 44 65 73 74 3b 0a 20 20 70 44  st = eDest;.  pD
0490: 65 73 74 2d 3e 69 50 61 72 6d 20 3d 20 69 50 61  est->iParm = iPa
04a0: 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66  rm;.  pDest->aff
04b0: 69 6e 69 74 79 20 3d 20 30 3b 0a 20 20 70 44 65  inity = 0;.  pDe
04c0: 73 74 2d 3e 69 4d 65 6d 20 3d 20 30 3b 0a 7d 0a  st->iMem = 0;.}.
04d0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
04e0: 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74   a new Select st
04f0: 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75  ructure and retu
0500: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
0510: 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72  that.** structur
0520: 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71  e..*/.Select *sq
0530: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a  lite3SelectNew(.
0540: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
0550: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
0560: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
0570: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
0580: 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63  ,     /* which c
0590: 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64  olumns to includ
05a0: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
05b0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
05c0: 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  rc,        /* th
05d0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d  e FROM clause --
05e0: 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f   which tables to
05f0: 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20   scan */.  Expr 
0600: 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
0610: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
0620: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
0630: 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20  st *pGroupBy,   
0640: 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  /* the GROUP BY 
0650: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
0660: 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20   *pHaving,      
0670: 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20    /* the HAVING 
0680: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
0690: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
06a0: 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42    /* the ORDER B
06b0: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
06c0: 74 20 69 73 44 69 73 74 69 6e 63 74 2c 20 20 20  t isDistinct,   
06d0: 20 20 20 20 2f 2a 20 74 72 75 65 20 69 66 20 74      /* true if t
06e0: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
06f0: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
0700: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
0710: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d  ,         /* LIM
0720: 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20  IT value.  NULL 
0730: 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a  means not used *
0740: 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65  /.  Expr *pOffse
0750: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46  t         /* OFF
0760: 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  SET value.  NULL
0770: 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74   means no offset
0780: 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
0790: 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20  *pNew;.  Select 
07a0: 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74  standin;.  sqlit
07b0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
07c0: 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  >db;.  pNew = sq
07d0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
07e0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  o(db, sizeof(*pN
07f0: 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ew) );.  assert(
0800: 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70 4c 69   !pOffset || pLi
0810: 6d 69 74 20 29 3b 20 20 20 2f 2a 20 43 61 6e 27  mit );   /* Can'
0820: 74 20 68 61 76 65 20 4f 46 46 53 45 54 20 77 69  t have OFFSET wi
0830: 74 68 6f 75 74 20 4c 49 4d 49 54 2e 20 2a 2f 0a  thout LIMIT. */.
0840: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
0850: 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61  .    pNew = &sta
0860: 6e 64 69 6e 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ndin;.    memset
0870: 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (pNew, 0, sizeof
0880: 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20 20  (*pNew));.  }.  
0890: 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b  if( pEList==0 ){
08a0: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71  .    pEList = sq
08b0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
08c0: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
08d0: 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 54 4b  qlite3Expr(db,TK
08e0: 5f 41 4c 4c 2c 30 2c 30 2c 30 29 2c 20 30 29 3b  _ALL,0,0,0), 0);
08f0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
0900: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
0910: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72  pNew->pSrc = pSr
0920: 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  c;.  pNew->pWher
0930: 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e  e = pWhere;.  pN
0940: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70  ew->pGroupBy = p
0950: 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d  GroupBy;.  pNew-
0960: 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69  >pHaving = pHavi
0970: 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64  ng;.  pNew->pOrd
0980: 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
0990: 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69 73 74 69  .  pNew->isDisti
09a0: 6e 63 74 20 3d 20 69 73 44 69 73 74 69 6e 63 74  nct = isDistinct
09b0: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54  ;.  pNew->op = T
09c0: 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 61 73 73 65  K_SELECT;.  asse
09d0: 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c  rt( pOffset==0 |
09e0: 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20  | pLimit!=0 );. 
09f0: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
0a00: 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e  pLimit;.  pNew->
0a10: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
0a20: 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69  t;.  pNew->iLimi
0a30: 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  t = -1;.  pNew->
0a40: 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20  iOffset = -1;.  
0a50: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0a60: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
0a70: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0a80: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
0a90: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
0aa0: 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 4e  ] = -1;.  if( pN
0ab0: 65 77 3d 3d 26 73 74 61 6e 64 69 6e 29 20 7b 0a  ew==&standin) {.
0ac0: 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28      clearSelect(
0ad0: 70 4e 65 77 29 3b 0a 20 20 20 20 70 4e 65 77 20  pNew);.    pNew 
0ae0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
0af0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
0b00: 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76 65   Delete the give
0b10: 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  n Select structu
0b20: 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  re and all of it
0b30: 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73 2e  s substructures.
0b40: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0b50: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 53 65 6c  SelectDelete(Sel
0b60: 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ect *p){.  if( p
0b70: 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c   ){.    clearSel
0b80: 65 63 74 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  ect(p);.    sqli
0b90: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
0ba0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
0bb0: 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65  1 to 3 identifie
0bc0: 72 73 20 70 72 65 63 65 65 64 69 6e 67 20 74 68  rs preceeding th
0bd0: 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20  e JOIN keyword, 
0be0: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a  determine the.**
0bf0: 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20   type of join.  
0c00: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
0c10: 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  r constant that 
0c20: 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74  expresses that t
0c30: 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20  ype.** in terms 
0c40: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
0c50: 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a   bit values:.**.
0c60: 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a  **     JT_INNER.
0c70: 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a  **     JT_CROSS.
0c80: 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a  **     JT_OUTER.
0c90: 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41  **     JT_NATURA
0ca0: 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54  L.**     JT_LEFT
0cb0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54  .**     JT_RIGHT
0cc0: 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75  .**.** A full ou
0cd0: 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20  ter join is the 
0ce0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a  combination of J
0cf0: 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49  T_LEFT and JT_RI
0d00: 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  GHT..**.** If an
0d10: 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75   illegal or unsu
0d20: 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70  pported join typ
0d30: 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20  e is seen, then 
0d40: 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20  still return.** 
0d50: 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74  a join type, but
0d60: 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e   put an error in
0d70: 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
0d80: 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cture..*/.int sq
0d90: 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61  lite3JoinType(Pa
0da0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
0db0: 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70  en *pA, Token *p
0dc0: 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20  B, Token *pC){. 
0dd0: 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
0de0: 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c  0;.  Token *apAl
0df0: 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  l[3];.  Token *p
0e00: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0e10: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
0e20: 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 77 6f 72  nst char zKeywor
0e30: 64 5b 38 5d 3b 0a 20 20 20 20 75 38 20 6e 43 68  d[8];.    u8 nCh
0e40: 61 72 3b 0a 20 20 20 20 75 38 20 63 6f 64 65 3b  ar;.    u8 code;
0e50: 0a 20 20 7d 20 6b 65 79 77 6f 72 64 73 5b 5d 20  .  } keywords[] 
0e60: 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 61 74 75 72  = {.    { "natur
0e70: 61 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41 54 55 52  al", 7, JT_NATUR
0e80: 41 4c 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65 66  AL },.    { "lef
0e90: 74 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46  t",    4, JT_LEF
0ea0: 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20  T|JT_OUTER },.  
0eb0: 20 20 7b 20 22 72 69 67 68 74 22 2c 20 20 20 35    { "right",   5
0ec0: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
0ed0: 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75  TER },.    { "fu
0ee0: 6c 6c 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45  ll",    4, JT_LE
0ef0: 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  FT|JT_RIGHT|JT_O
0f00: 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 6f  UTER },.    { "o
0f10: 75 74 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 4f  uter",   5, JT_O
0f20: 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 69  UTER },.    { "i
0f30: 6e 6e 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 49  nner",   5, JT_I
0f40: 4e 4e 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 63  NNER },.    { "c
0f50: 72 6f 73 73 22 2c 20 20 20 35 2c 20 4a 54 5f 49  ross",   5, JT_I
0f60: 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 7d 2c  NNER|JT_CROSS },
0f70: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  .  };.  int i, j
0f80: 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70  ;.  apAll[0] = p
0f90: 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20  A;.  apAll[1] = 
0fa0: 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d  pB;.  apAll[2] =
0fb0: 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   pC;.  for(i=0; 
0fc0: 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b  i<3 && apAll[i];
0fd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61   i++){.    p = a
0fe0: 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  pAll[i];.    for
0ff0: 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b  (j=0; j<sizeof(k
1000: 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28  eywords)/sizeof(
1010: 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b  keywords[0]); j+
1020: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
1030: 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e  >n==keywords[j].
1040: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
1050: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
1060: 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  Cmp((char*)p->z,
1070: 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b 65   keywords[j].zKe
1080: 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30 20  yword, p->n)==0 
1090: 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74  ){.        joint
10a0: 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72 64 73 5b  ype |= keywords[
10b0: 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20  j].code;.       
10c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
10d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e      }.    if( j>
10e0: 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73  =sizeof(keywords
10f0: 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64  )/sizeof(keyword
1100: 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 6a  s[0]) ){.      j
1110: 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52  ointype |= JT_ER
1120: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
1130: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1140: 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  (.     (jointype
1150: 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   & (JT_INNER|JT_
1160: 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e  OUTER))==(JT_INN
1170: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a  ER|JT_OUTER) ||.
1180: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1190: 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20   JT_ERROR)!=0.  
11a0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
11b0: 72 20 2a 7a 53 70 31 20 3d 20 22 20 22 3b 0a 20  r *zSp1 = " ";. 
11c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11d0: 53 70 32 20 3d 20 22 20 22 3b 0a 20 20 20 20 69  Sp2 = " ";.    i
11e0: 66 28 20 70 42 3d 3d 30 20 29 7b 20 7a 53 70 31  f( pB==0 ){ zSp1
11f0: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 43  ++; }.    if( pC
1200: 3d 3d 30 20 29 7b 20 7a 53 70 32 2b 2b 3b 20 7d  ==0 ){ zSp2++; }
1210: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1220: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
1230: 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f  known or unsuppo
1240: 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20  rted join type: 
1250: 22 0a 20 20 20 20 20 20 20 22 25 54 25 73 25 54  ".       "%T%s%T
1260: 25 73 25 54 22 2c 20 70 41 2c 20 7a 53 70 31 2c  %s%T", pA, zSp1,
1270: 20 70 42 2c 20 7a 53 70 32 2c 20 70 43 29 3b 0a   pB, zSp2, pC);.
1280: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
1290: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65  T_INNER;.  }else
12a0: 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20 26 20   if( jointype & 
12b0: 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20 20 20  JT_RIGHT ){.    
12c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12d0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
12e0: 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f  RIGHT and FULL O
12f0: 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e  UTER JOINs are n
1300: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70  ot currently sup
1310: 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f  ported");.    jo
1320: 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45  intype = JT_INNE
1330: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
1340: 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  jointype;.}../*.
1350: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
1360: 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  dex of a column 
1370: 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74  in a table.  Ret
1380: 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f  urn -1 if the co
1390: 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63  lumn.** is not c
13a0: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
13b0: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
13c0: 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   int columnIndex
13d0: 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f  (Table *pTab, co
13e0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b  nst char *zCol){
13f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1400: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
1410: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
1420: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1430: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
1440: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20  ame, zCol)==0 ) 
1450: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
1460: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
1470: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
1480: 65 20 6f 66 20 61 20 74 6f 6b 65 6e 20 74 6f 20  e of a token to 
1490: 61 20 27 5c 30 30 30 27 2d 74 65 72 6d 69 6e 61  a '\000'-termina
14a0: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  ted string..*/.s
14b0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 54 6f  tatic void setTo
14c0: 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f  ken(Token *p, co
14d0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
14e0: 70 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a 3b 0a 20  p->z = (u8*)z;. 
14f0: 20 70 2d 3e 6e 20 3d 20 7a 20 3f 20 73 74 72 6c   p->n = z ? strl
1500: 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 70 2d 3e  en(z) : 0;.  p->
1510: 64 79 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  dyn = 0;.}../*.*
1520: 2a 20 53 65 74 20 74 68 65 20 74 6f 6b 65 6e 20  * Set the token 
1530: 74 6f 20 74 68 65 20 64 6f 75 62 6c 65 2d 71 75  to the double-qu
1540: 6f 74 65 64 20 61 6e 64 20 65 73 63 61 70 65 64  oted and escaped
1550: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
1560: 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 0a 2a  string pointed.*
1570: 2a 20 74 6f 20 62 79 20 7a 2e 20 46 6f 72 20 65  * to by z. For e
1580: 78 61 6d 70 6c 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  xample;.**.**   
1590: 20 7b 61 22 62 63 7d 20 20 2d 3e 20 20 7b 22 61   {a"bc}  ->  {"a
15a0: 22 22 62 63 22 7d 0a 2a 2f 0a 73 74 61 74 69 63  ""bc"}.*/.static
15b0: 20 76 6f 69 64 20 73 65 74 51 75 6f 74 65 64 54   void setQuotedT
15c0: 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70 50 61 72  oken(Parse *pPar
15d0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f  se, Token *p, co
15e0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
15f0: 70 2d 3e 7a 20 3d 20 28 75 38 20 2a 29 73 71 6c  p->z = (u8 *)sql
1600: 69 74 65 33 4d 50 72 69 6e 74 66 28 30 2c 20 22  ite3MPrintf(0, "
1610: 5c 22 25 77 5c 22 22 2c 20 7a 29 3b 0a 20 20 70  \"%w\"", z);.  p
1620: 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 69 66 28  ->dyn = 1;.  if(
1630: 20 70 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 2d 3e   p->z ){.    p->
1640: 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72  n = strlen((char
1650: 20 2a 29 70 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73   *)p->z);.  }els
1660: 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64  e{.    pParse->d
1670: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1680: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
1690: 2a 20 43 72 65 61 74 65 20 61 6e 20 65 78 70 72  * Create an expr
16a0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20  ession node for 
16b0: 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 77 69  an identifier wi
16c0: 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 7a  th the name of z
16d0: 4e 61 6d 65 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  Name.*/.Expr *sq
16e0: 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70  lite3CreateIdExp
16f0: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1700: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1710: 6d 65 29 7b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d  me){.  Token dum
1720: 6d 79 3b 0a 20 20 73 65 74 54 6f 6b 65 6e 28 26  my;.  setToken(&
1730: 64 75 6d 6d 79 2c 20 7a 4e 61 6d 65 29 3b 0a 20  dummy, zName);. 
1740: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
1750: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
1760: 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79  ID, 0, 0, &dummy
1770: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  );.}.../*.** Add
1780: 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 57   a term to the W
1790: 48 45 52 45 20 65 78 70 72 65 73 73 69 6f 6e 20  HERE expression 
17a0: 69 6e 20 2a 70 70 45 78 70 72 20 74 68 61 74 20  in *ppExpr that 
17b0: 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a 2a 20  requires the.** 
17c0: 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74 6f 20 62  zCol column to b
17d0: 65 20 65 71 75 61 6c 20 69 6e 20 74 68 65 20 74  e equal in the t
17e0: 77 6f 20 74 61 62 6c 65 73 20 70 54 61 62 31 20  wo tables pTab1 
17f0: 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f 0a 73 74  and pTab2..*/.st
1800: 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65  atic void addWhe
1810: 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20  reTerm(.  Parse 
1820: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1830: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1840: 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ntext */.  const
1850: 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20   char *zCol,    
1860: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1870: 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  he column */.  c
1880: 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62  onst Table *pTab
1890: 31 2c 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  1,      /* First
18a0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73   table */.  cons
18b0: 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73 31 2c  t char *zAlias1,
18c0: 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f       /* Alias fo
18d0: 72 20 66 69 72 73 74 20 74 61 62 6c 65 2e 20 20  r first table.  
18e0: 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
18f0: 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54   const Table *pT
1900: 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53 65 63  ab2,      /* Sec
1910: 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63  ond table */.  c
1920: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61  onst char *zAlia
1930: 73 32 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73  s2,     /* Alias
1940: 20 66 6f 72 20 73 65 63 6f 6e 64 20 74 61 62 6c   for second tabl
1950: 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
1960: 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 4a  */.  int iRightJ
1970: 6f 69 6e 54 61 62 6c 65 2c 20 20 20 20 20 2f 2a  oinTable,     /*
1980: 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
1990: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
19a0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
19b0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
19c0: 2a 20 41 64 64 20 74 68 65 20 65 71 75 61 6c 69  * Add the equali
19d0: 74 79 20 74 65 72 6d 20 74 6f 20 74 68 69 73 20  ty term to this 
19e0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
19f0: 0a 20 20 45 78 70 72 20 2a 70 45 31 61 2c 20 2a  .  Expr *pE1a, *
1a00: 70 45 31 62 2c 20 2a 70 45 31 63 3b 0a 20 20 45  pE1b, *pE1c;.  E
1a10: 78 70 72 20 2a 70 45 32 61 2c 20 2a 70 45 32 62  xpr *pE2a, *pE2b
1a20: 2c 20 2a 70 45 32 63 3b 0a 20 20 45 78 70 72 20  , *pE2c;.  Expr 
1a30: 2a 70 45 3b 0a 0a 20 20 70 45 31 61 20 3d 20 73  *pE;..  pE1a = s
1a40: 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78  qlite3CreateIdEx
1a50: 70 72 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 29  pr(pParse, zCol)
1a60: 3b 0a 20 20 70 45 32 61 20 3d 20 73 71 6c 69 74  ;.  pE2a = sqlit
1a70: 65 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70  e3CreateIdExpr(p
1a80: 50 61 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20  Parse, zCol);.  
1a90: 69 66 28 20 7a 41 6c 69 61 73 31 3d 3d 30 20 29  if( zAlias1==0 )
1aa0: 7b 0a 20 20 20 20 7a 41 6c 69 61 73 31 20 3d 20  {.    zAlias1 = 
1ab0: 70 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pTab1->zName;.  
1ac0: 7d 0a 20 20 70 45 31 62 20 3d 20 73 71 6c 69 74  }.  pE1b = sqlit
1ad0: 65 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70  e3CreateIdExpr(p
1ae0: 50 61 72 73 65 2c 20 7a 41 6c 69 61 73 31 29 3b  Parse, zAlias1);
1af0: 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 32 3d 3d  .  if( zAlias2==
1b00: 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 32  0 ){.    zAlias2
1b10: 20 3d 20 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b   = pTab2->zName;
1b20: 0a 20 20 7d 0a 20 20 70 45 32 62 20 3d 20 73 71  .  }.  pE2b = sq
1b30: 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70  lite3CreateIdExp
1b40: 72 28 70 50 61 72 73 65 2c 20 7a 41 6c 69 61 73  r(pParse, zAlias
1b50: 32 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c  2);.  pE1c = sql
1b60: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
1b70: 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 31 62 2c 20  , TK_DOT, pE1b, 
1b80: 70 45 31 61 2c 20 30 29 3b 0a 20 20 70 45 32 63  pE1a, 0);.  pE2c
1b90: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
1ba0: 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
1bb0: 70 45 32 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a  pE2b, pE2a, 0);.
1bc0: 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33 50 45    pE = sqlite3PE
1bd0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 45  xpr(pParse, TK_E
1be0: 51 2c 20 70 45 31 63 2c 20 70 45 32 63 2c 20 30  Q, pE1c, pE2c, 0
1bf0: 29 3b 0a 20 20 69 66 28 20 70 45 20 29 7b 0a 20  );.  if( pE ){. 
1c00: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
1c10: 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f  ty(pE, EP_FromJo
1c20: 69 6e 29 3b 0a 20 20 20 20 70 45 2d 3e 69 52 69  in);.    pE->iRi
1c30: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 69  ghtJoinTable = i
1c40: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
1c50: 20 20 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d 20    }.  *ppExpr = 
1c60: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
1c70: 50 61 72 73 65 2d 3e 64 62 2c 2a 70 70 45 78 70  Parse->db,*ppExp
1c80: 72 2c 20 70 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r, pE);.}../*.**
1c90: 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f 6d   Set the EP_From
1ca0: 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e  Join property on
1cb0: 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
1cc0: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
1cd0: 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74  on..** And set t
1ce0: 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  he Expr.iRightJo
1cf0: 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62 6c  inTable to iTabl
1d00: 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d  e for every term
1d10: 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   in the.** expre
1d20: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ssion..**.** The
1d30: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f   EP_FromJoin pro
1d40: 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e  perty is used on
1d50: 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70   terms of an exp
1d60: 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a  ression to tell.
1d70: 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45  ** the LEFT OUTE
1d80: 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e  R JOIN processin
1d90: 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69  g logic that thi
1da0: 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f  s term is part o
1db0: 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65  f the.** join re
1dc0: 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66  striction specif
1dd0: 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ied in the ON or
1de0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e   USING clause an
1df0: 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20  d not a part.** 
1e00: 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65  of the more gene
1e10: 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  ral WHERE clause
1e20: 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61  .  These terms a
1e30: 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f  re moved over to
1e40: 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
1e50: 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e  ause during join
1e60: 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20   processing but 
1e70: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  we need to remem
1e80: 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a  ber that they.**
1e90: 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74   originated in t
1ea0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
1eb0: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lause..**.** The
1ec0: 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e   Expr.iRightJoin
1ed0: 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65 20  Table tells the 
1ee0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
1ef0: 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68 65  cessing that the
1f00: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64  .** expression d
1f10: 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20  epends on table 
1f20: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1f30: 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61 62  even if that tab
1f40: 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70  le is not.** exp
1f50: 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65  licitly mentione
1f60: 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73  d in the express
1f70: 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f 72  ion.  That infor
1f80: 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65 64  mation is needed
1f90: 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c 69  .** for cases li
1fa0: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1fb0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1fc0: 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
1fd0: 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44  ON t1.a=t2.b AND
1fe0: 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68   t1.x=5.**.** Th
1ff0: 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6e  e where clause n
2000: 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74 68  eeds to defer th
2010: 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68  e handling of th
2020: 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d  e t1.x=5.** term
2030: 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65   until after the
2040: 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20   t2 loop of the 
2050: 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20 77  join.  In that w
2060: 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32  ay, a.** NULL t2
2070: 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e 73   row will be ins
2080: 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  erted whenever t
2090: 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20 64  1.x!=5.  If we d
20a0: 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74  o not.** defer t
20b0: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
20c0: 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62  1.x=5, it will b
20d0: 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d 65  e processed imme
20e0: 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72  diately.** after
20f0: 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64   the t1 loop and
2100: 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78 21   rows with t1.x!
2110: 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 70  =5 will never ap
2120: 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f  pear in.** the o
2130: 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73 20  utput, which is 
2140: 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74  incorrect..*/.st
2150: 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69  atic void setJoi
2160: 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69  nExpr(Expr *p, i
2170: 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68  nt iTable){.  wh
2180: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78  ile( p ){.    Ex
2190: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c  prSetProperty(p,
21a0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
21b0: 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e     p->iRightJoin
21c0: 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a  Table = iTable;.
21d0: 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
21e0: 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  p->pLeft, iTable
21f0: 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52  );.    p = p->pR
2200: 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a  ight;.  } .}../*
2210: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2220: 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 6a   processes the j
2230: 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oin information 
2240: 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61  for a SELECT sta
2250: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e  tement..** ON an
2260: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
2270: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  are converted in
2280: 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  to extra terms o
2290: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
22a0: 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a  se..** NATURAL j
22b0: 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74 65  oins also create
22c0: 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61   extra WHERE cla
22d0: 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a  use terms..**.**
22e0: 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20   The terms of a 
22f0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65 20  FROM clause are 
2300: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
2310: 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74 72   Select.pSrc str
2320: 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c  ucture..** The l
2330: 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20 69  eft most table i
2340: 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  s the first entr
2350: 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72 63  y in Select.pSrc
2360: 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
2370: 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74 68  t.** table is th
2380: 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20 54  e last entry.  T
2390: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
23a0: 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20   is held in the 
23b0: 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20  entry to.** the 
23c0: 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74 72  left.  Thus entr
23d0: 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  y 0 contains the
23e0: 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 66   join operator f
23f0: 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74 77  or the join betw
2400: 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30  een.** entries 0
2410: 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20   and 1.  Any ON 
2420: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
2430: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2440: 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a   the join are.**
2450: 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20 74   also attached t
2460: 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72 79  o the left entry
2470: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2480: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
2490: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
24a0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  s encountered..*
24b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
24c0: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50  iteProcessJoin(P
24d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
24e0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c  lect *p){.  SrcL
24f0: 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
2500: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2510: 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
2520: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
2530: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2560: 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  rs */.  struct S
2570: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65  rcList_item *pLe
2580: 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74 20  ft;     /* Left 
2590: 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e  table being join
25a0: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ed */.  struct S
25b0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52 69  rcList_item *pRi
25c0: 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 74  ght;    /* Right
25d0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
25e0: 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d  ned */..  pSrc =
25f0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66   p->pSrc;.  pLef
2600: 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b  t = &pSrc->a[0];
2610: 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c 65  .  pRight = &pLe
2620: 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ft[1];.  for(i=0
2630: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ; i<pSrc->nSrc-1
2640: 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c  ; i++, pRight++,
2650: 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54   pLeft++){.    T
2660: 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20 3d  able *pLeftTab =
2670: 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20 20   pLeft->pTab;.  
2680: 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54    Table *pRightT
2690: 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61  ab = pRight->pTa
26a0: 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 65 66  b;..    if( pLef
26b0: 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68  tTab==0 || pRigh
26c0: 74 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  tTab==0 ) contin
26d0: 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  ue;..    /* When
26e0: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
26f0: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c  word is present,
2700: 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73   add WHERE claus
2710: 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20  e terms for.    
2720: 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ** every column 
2730: 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62  that the two tab
2740: 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d  les have in comm
2750: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
2760: 66 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74  f( pRight->joint
2770: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
2780: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
2790: 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69  ight->pOn || pRi
27a0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
27b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
27c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
27d0: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d  a NATURAL join m
27e0: 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20  ay not have ".  
27f0: 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20           "an ON 
2800: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22  or USING clause"
2810: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
2820: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
2830: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2840: 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43 6f 6c 3b  <pLeftTab->nCol;
2850: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
2860: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 65  har *zName = pLe
2870: 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  ftTab->aCol[j].z
2880: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
2890: 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52  ( columnIndex(pR
28a0: 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3e  ightTab, zName)>
28b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
28c0: 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61  addWhereTerm(pPa
28d0: 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c 65 66  rse, zName, pLef
28e0: 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c  tTab, pLeft->zAl
28f0: 69 61 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ias, .          
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 20 20 20 70 52 69 67 68 74 54 61 62 2c 20 70      pRightTab, p
2920: 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20  Right->zAlias,. 
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
2950: 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20 26 70  ght->iCursor, &p
2960: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
2970: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a       .        }.
2980: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2990: 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62     /* Disallow b
29a0: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
29b0: 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20   clauses in the 
29c0: 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f  same join.    */
29d0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
29e0: 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e  >pOn && pRight->
29f0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
2a00: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2a10: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
2a20: 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64  have both ON and
2a30: 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20   USING ".       
2a40: 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65   "clauses in the
2a50: 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20   same join");.  
2a60: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2a70: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
2a80: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f  the ON clause to
2a90: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2aa0: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f  WHERE clause, co
2ab0: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a  nnected by.    *
2ac0: 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  * an AND operato
2ad0: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
2ae0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b  ( pRight->pOn ){
2af0: 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78  .      setJoinEx
2b00: 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20  pr(pRight->pOn, 
2b10: 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29  pRight->iCursor)
2b20: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72  ;.      p->pWher
2b30: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
2b40: 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
2b50: 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68 74  ->pWhere, pRight
2b60: 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52  ->pOn);.      pR
2b70: 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20  ight->pOn = 0;. 
2b80: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
2b90: 61 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20  ate extra terms 
2ba0: 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  on the WHERE cla
2bb0: 75 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  use for each col
2bc0: 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a  umn named.    **
2bd0: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
2be0: 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20  ause.  Example: 
2bf0: 49 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  If the two table
2c00: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61  s to be joined a
2c10: 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64  re .    ** A and
2c20: 20 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47   B and the USING
2c30: 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c   clause names X,
2c40: 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20   Y, and Z, then 
2c50: 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  add this.    ** 
2c60: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
2c70: 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20  use:    A.X=B.X 
2c80: 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20  AND A.Y=B.Y AND 
2c90: 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52  A.Z=B.Z.    ** R
2ca0: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69  eport an error i
2cb0: 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e  f any column men
2cc0: 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53  tioned in the US
2cd0: 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20  ING clause is.  
2ce0: 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e    ** not contain
2cf0: 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  ed in both table
2d00: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a  s to be joined..
2d10: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2d20: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
2d30: 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70  .      IdList *p
2d40: 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70  List = pRight->p
2d50: 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72  Using;.      for
2d60: 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e  (j=0; j<pList->n
2d70: 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; j++){.      
2d80: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
2d90: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  pList->a[j].zNam
2da0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  e;.        if( c
2db0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74  olumnIndex(pLeft
2dc0: 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c  Tab, zName)<0 ||
2dd0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69   columnIndex(pRi
2de0: 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30  ghtTab, zName)<0
2df0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2e00: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2e10: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f  arse, "cannot jo
2e20: 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20  in using column 
2e30: 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20  %s - column ".  
2e40: 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70            "not p
2e50: 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74  resent in both t
2e60: 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ables", zName);.
2e70: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2e80: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2e90: 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65        addWhereTe
2ea0: 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  rm(pParse, zName
2eb0: 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66  , pLeftTab, pLef
2ec0: 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20  t->zAlias, .    
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 54 61          pRightTa
2ef0: 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61  b, pRight->zAlia
2f00: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2f20: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20  Right->iCursor, 
2f30: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
2f40: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2f50: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2f60: 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20  .** Insert code 
2f70: 69 6e 74 6f 20 22 76 22 20 74 68 61 74 20 77 69  into "v" that wi
2f80: 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65 63 6f  ll push the reco
2f90: 72 64 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  rd on the top of
2fa0: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e   the.** stack in
2fb0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
2fc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  /.static void pu
2fd0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
2fe0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2ff0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
3000: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
3010: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
3020: 2c 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  ,    /* The ORDE
3030: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
3040: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
3050: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77  ,       /* The w
3060: 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74  hole SELECT stat
3070: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ement */.  int r
3080: 65 67 44 61 74 61 20 20 20 20 20 20 20 20 20 20  egData          
3090: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
30a0: 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65  lding data to be
30b0: 20 73 6f 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20   sorted */.){.  
30c0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
30d0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6e  ->pVdbe;.  int n
30e0: 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
30f0: 3e 6e 45 78 70 72 3b 0a 20 20 69 6e 74 20 72 65  >nExpr;.  int re
3100: 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47  gBase = sqlite3G
3110: 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
3120: 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20  se, nExpr+2);.  
3130: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
3140: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
3150: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
3160: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
3170: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72  List(pParse, pOr
3180: 64 65 72 42 79 2c 20 72 65 67 42 61 73 65 29 3b  derBy, regBase);
3190: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
31a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp2(v, OP_Seque
31b0: 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  nce, pOrderBy->i
31c0: 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65  ECursor, regBase
31d0: 2b 6e 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74  +nExpr);.  sqlit
31e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
31f0: 4f 50 5f 4d 6f 76 65 2c 20 72 65 67 44 61 74 61  OP_Move, regData
3200: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b  , regBase+nExpr+
3210: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
3220: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
3230: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73  keRecord, regBas
3240: 65 2c 20 6e 45 78 70 72 20 2b 20 32 2c 20 72 65  e, nExpr + 2, re
3250: 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
3260: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3270: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
3280: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
3290: 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  r, regRecord);. 
32a0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
32b0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
32c0: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
32d0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
32e0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
32f0: 42 61 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a  Base, nExpr+2);.
3300: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69    if( pSelect->i
3310: 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20  Limit>=0 ){.    
3320: 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
3330: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74  ;.    int iLimit
3340: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ;.    if( pSelec
3350: 74 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  t->pOffset ){.  
3360: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65      iLimit = pSe
3370: 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b  lect->iOffset+1;
3380: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3390: 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65    iLimit = pSele
33a0: 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  ct->iLimit;.    
33b0: 7d 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  }.    addr1 = sq
33c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
33d0: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c  v, OP_IfZero, iL
33e0: 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  imit);.    sqlit
33f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3400: 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69  OP_AddImm, iLimi
3410: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  t, -1);.    addr
3420: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
3430: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
3440: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3450: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
3460: 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr1);.    sqlite
3470: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
3480: 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79  P_Last, pOrderBy
3490: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
34a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34b0: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
34c0: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
34d0: 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  sor);.    sqlite
34e0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
34f0: 20 61 64 64 72 32 29 3b 0a 20 20 20 20 70 53 65   addr2);.    pSe
3500: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d  lect->iLimit = -
3510: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
3520: 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c  Add code to impl
3530: 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54  ement the OFFSET
3540: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3550: 63 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64  codeOffset(.  Vd
3560: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
3570: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
3580: 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f   into this VM */
3590: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
35a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
35b0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
35c0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
35d0: 74 20 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20  t iContinue     
35e0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
35f0: 73 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e 74  skip the current
3600: 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
3610: 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 3e 3d  if( p->iOffset>=
3620: 30 20 26 26 20 69 43 6f 6e 74 69 6e 75 65 21 3d  0 && iContinue!=
3630: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  0 ){.    int add
3640: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  r;.    sqlite3Vd
3650: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
3660: 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66 73 65  ddImm, p->iOffse
3670: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  t, -1);.    addr
3680: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
3690: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 65 67  dOp1(v, OP_IfNeg
36a0: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20  , p->iOffset);. 
36b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
36d0: 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   0, iContinue);.
36e0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
36f0: 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45 54  (v, "skip OFFSET
3700: 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 20   records"));.   
3710: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
3720: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
3730: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
3740: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
3750: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
3760: 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72  e the N register
3770: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d  s starting at iM
3780: 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73  em.** form a dis
3790: 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54  tinct entry.  iT
37a0: 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20  ab is a sorting 
37b0: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
37c0: 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73   previously.** s
37d0: 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  een combinations
37e0: 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73   of the N values
37f0: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
3800: 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a  s made in iTab.*
3810: 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  * if the current
3820: 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65   N values are ne
3830: 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  w..**.** A jump 
3840: 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73  to addrRepeat is
3850: 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b   made and the N+
3860: 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70  1 values are pop
3870: 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ped from the.** 
3880: 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70  stack if the top
3890: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20   N elements are 
38a0: 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f  not distinct..*/
38b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
38c0: 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72  eDistinct(.  Par
38d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
38e0: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
38f0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
3900: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
3910: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
3920: 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  * A sorting inde
3930: 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66  x used to test f
3940: 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20  or distinctness 
3950: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70  */.  int addrRep
3960: 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eat,    /* Jump 
3970: 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64  to here if not d
3980: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
3990: 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
39a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
39b0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
39c0: 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem           /*
39d0: 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a   First element *
39e0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  /.){.  Vdbe *v;.
39f0: 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d    int r1;..  v =
3a00: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
3a10: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
3a20: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
3a30: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3a40: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
3a50: 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c  Record, iMem, N,
3a60: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   r1);.  sqlite3V
3a70: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
3a80: 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64  Found, iTab, add
3a90: 72 52 65 70 65 61 74 2c 20 72 31 29 3b 0a 20 20  rRepeat, r1);.  
3aa0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3ab0: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
3ac0: 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20  t, iTab, r1);.  
3ad0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
3ae0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
3af0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
3b00: 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rate an error me
3b10: 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c  ssage when a SEL
3b20: 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74 68  ECT is used with
3b30: 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73 69  in a subexpressi
3b40: 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20  on.** (example: 
3b50: 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a   "a IN (SELECT *
3b60: 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62   FROM table)") b
3b70: 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74  ut it has more t
3b80: 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20  han 1 result.** 
3b90: 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74  column.  We do t
3ba0: 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74  his in a subrout
3bb0: 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65 20  ine because the 
3bc0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
3bd0: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 70 6c 61 63  multiple.** plac
3be0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
3bf0: 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  t checkForMultiC
3c00: 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
3c10: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3c20: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
3c30: 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20  e context. */.  
3c40: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
3c50: 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74  t,   /* Destinat
3c60: 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65  ion of SELECT re
3c70: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  sults */.  int n
3c80: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
3c90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
3ca0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75  ult columns retu
3cb0: 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a  rned by SELECT *
3cc0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74  /.){.  int eDest
3cd0: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
3ce0: 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26  .  if( nExpr>1 &
3cf0: 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  & (eDest==SRT_Me
3d00: 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  m || eDest==SRT_
3d10: 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Set) ){.    sqli
3d20: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3d30: 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67  se, "only a sing
3d40: 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65  le result allowe
3d50: 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22  d for ".       "
3d60: 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73  a SELECT that is
3d70: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
3d80: 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65  ession");.    re
3d90: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
3da0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
3db0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
3dc0: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
3dd0: 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
3de0: 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68  the inside of th
3df0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
3e00: 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  of a SELECT..**.
3e10: 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e 64  ** If srcTab and
3e20: 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74   nColumn are bot
3e30: 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  h zero, then the
3e40: 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69   pEList expressi
3e50: 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75  ons.** are evalu
3e60: 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
3e70: 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f   get the data fo
3e80: 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20  r this row.  If 
3e90: 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65  nColumn>0.** the
3ea0: 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64  n data is pulled
3eb0: 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64   from srcTab and
3ec0: 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20   pEList is used 
3ed0: 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a  only to get the.
3ee0: 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f 72  ** datatypes for
3ef0: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
3f00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
3f10: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
3f20: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3f30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
3f40: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
3f50: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
3f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
3f70: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
3f80: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
3f90: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70  g coded */.  Exp
3fa0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
3fb0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
3fc0: 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74  values being ext
3fd0: 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racted */.  int 
3fe0: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
3ff0: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
4000: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
4010: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
4020: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n,            /*
4030: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
4040: 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65  ns in the source
4050: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
4060: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
4070: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
4080: 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73  LL, sort results
4090: 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20   using this key 
40a0: 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63  */.  int distinc
40b0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
40c0: 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72  If >=0, make sur
40d0: 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
40e0: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 53 65 6c 65  stinct */.  Sele
40f0: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
4100: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
4110: 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
4120: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ults */.  int iC
4130: 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20  ontinue,        
4140: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
4150: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
4160: 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  next row */.  in
4170: 74 20 69 42 72 65 61 6b 2c 20 20 20 20 20 20 20  t iBreak,       
4180: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4190: 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
41a0: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
41b0: 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66  p */.  char *aff
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
41d0: 2a 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  * affinity strin
41e0: 67 20 69 66 20 65 44 65 73 74 20 69 73 20 53 52  g if eDest is SR
41f0: 54 5f 55 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  T_Union */.){.  
4200: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
4210: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
4220: 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69  ;.  int hasDisti
4230: 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  nct;        /* T
4240: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
4250: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
4260: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
4270: 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20  regResult;      
4280: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
4290: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69   of memory holdi
42a0: 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  ng result set */
42b0: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
42c0: 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f  Dest->eDest;   /
42d0: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
42e0: 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20   of results */. 
42f0: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
4300: 73 74 2d 3e 69 50 61 72 6d 3b 20 20 20 2f 2a 20  st->iParm;   /* 
4310: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
4320: 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f  o disposal metho
4330: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75  d */.  int nResu
4340: 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  ltCol;          
4350: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4360: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a  result columns *
4370: 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  /..  if( v==0 ) 
4380: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
4390: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a  ( pEList!=0 );..
43a0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
43b0: 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  s a LIMIT clause
43c0: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
43d0: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64  tatement, then d
43e0: 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a  o the check.  **
43f0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
4400: 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20 6f 75  row should be ou
4410: 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 68 61 73  tput..  */.  has
4420: 44 69 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69  Distinct = disti
4430: 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69 73 74  nct>=0 && pEList
4440: 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20 20 69 66 28  ->nExpr>0;.  if(
4450: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20   pOrderBy==0 && 
4460: 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  !hasDistinct ){.
4470: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
4480: 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , p, iContinue);
4490: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20  .  }..  /* Pull 
44a0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
44b0: 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  lumns..  */.  if
44c0: 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20  ( nColumn>0 ){. 
44d0: 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20     nResultCol = 
44e0: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65  nColumn;.  }else
44f0: 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c  {.    nResultCol
4500: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
4510: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65 73  ;.  }.  if( pDes
4520: 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20  t->iMem==0 ){.  
4530: 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20    pDest->iMem = 
4540: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
4550: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 52 65 73  nge(pParse, nRes
4560: 75 6c 74 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 72  ultCol);.  }.  r
4570: 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73 74  egResult = pDest
4580: 2d 3e 69 4d 65 6d 3b 0a 20 20 69 66 28 20 6e 43  ->iMem;.  if( nC
4590: 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66  olumn>0 ){.    f
45a0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
45b0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  n; i++){.      s
45c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
45d0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
45e0: 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73  rcTab, i, regRes
45f0: 75 6c 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20  ult+i);.    }.  
4600: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 21  }else if( eDest!
4610: 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20  =SRT_Exists ){. 
4620: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73     /* If the des
4630: 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45  tination is an E
4640: 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65  XISTS(...) expre
4650: 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61  ssion, the actua
4660: 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  l.    ** values 
4670: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
4680: 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72  SELECT are not r
4690: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
46a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
46b0: 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b  ResultCol; i++){
46c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
46d0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
46e0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
46f0: 72 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b  r, regResult+i);
4700: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 43 6f  .    }.  }.  nCo
4710: 6c 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74 43 6f  lumn = nResultCo
4720: 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  l;..  /* If the 
4730: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
4740: 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20   was present on 
4750: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
4760: 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ment.  ** and th
4770: 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20  is row has been 
4780: 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65  seen before, the
4790: 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68  n do not make th
47a0: 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74  is row.  ** part
47b0: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   of the result..
47c0: 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69    */.  if( hasDi
47d0: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73  stinct ){.    as
47e0: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
47f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
4800: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43  EList->nExpr==nC
4810: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64  olumn );.    cod
4820: 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65  eDistinct(pParse
4830: 2c 20 64 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e  , distinct, iCon
4840: 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  tinue, nColumn, 
4850: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
4860: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
4870: 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66  ){.      codeOff
4880: 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69  set(v, p, iConti
4890: 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nue);.    }.  }.
48a0: 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d  .  if( checkForM
48b0: 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74  ultiColumnSelect
48c0: 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44  Error(pParse, pD
48d0: 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  est, pEList->nEx
48e0: 70 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  pr) ){.    retur
48f0: 6e 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  n;.  }..  switch
4900: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f  ( eDest ){.    /
4910: 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20  * In this mode, 
4920: 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79  write each query
4930: 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b   result to the k
4940: 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  ey of the tempor
4950: 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ary.    ** table
4960: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23   iParm..    */.#
4970: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4980: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
4990: 43 54 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  CT.    case SRT_
49a0: 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69  Union: {.      i
49b0: 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20  nt r1;.      r1 
49c0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
49d0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
49e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
49f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
4a00: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
4a10: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a  , nColumn, r1);.
4a20: 20 20 20 20 20 20 69 66 28 20 61 66 66 20 29 7b        if( aff ){
4a30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4a40: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
4a50: 2d 31 2c 20 61 66 66 2c 20 50 34 5f 53 54 41 54  -1, aff, P4_STAT
4a60: 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IC);.      }.   
4a70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4a80: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
4a90: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29  sert, iParm, r1)
4aa0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
4ab0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
4ac0: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
4ad0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
4ae0: 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20     /* Construct 
4af0: 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  a record from th
4b00: 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20  e query result, 
4b10: 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20  but instead of. 
4b20: 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61     ** saving tha
4b30: 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74  t record, use it
4b40: 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c   as a key to del
4b50: 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f  ete elements fro
4b60: 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d  m.    ** the tem
4b70: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
4b80: 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rm..    */.    c
4b90: 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20  ase SRT_Except: 
4ba0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a  {.      int r1;.
4bb0: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
4bc0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
4bd0: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
4be0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4bf0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4c00: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
4c10: 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  mn, r1);.      s
4c20: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4c30: 50 34 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50  P4(v, -1, aff, P
4c40: 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  4_STATIC);.     
4c50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4c60: 70 32 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65  p2(v, OP_IdxDele
4c70: 74 65 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a  te, iParm, r1);.
4c80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
4c90: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
4ca0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
4cb0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
4cc0: 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65  if..    /* Store
4cd0: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
4ce0: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
4cf0: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
4d00: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
4d10: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
4d20: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
4d30: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
4d40: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
4d50: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
4d60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4d70: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4d80: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
4d90: 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 69  mn, r1);.      i
4da0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
4db0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
4dc0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
4dd0: 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a  rderBy, p, r1);.
4de0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4df0: 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
4e00: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
4e10: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
4e20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4e30: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
4e40: 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20  d, iParm, r2);. 
4e50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4e60: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
4e70: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
4e80: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
4e90: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4ea0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
4eb0: 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71  END);.        sq
4ec0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
4ed0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
4ee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
4ef0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
4f00: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
4f10: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4f20: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
4f30: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
4f40: 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
4f50: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
4f60: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
4f70: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
4f80: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
4f90: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
4fa0: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
4fb0: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
4fc0: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
4fd0: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
4fe0: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
4ff0: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
5000: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
5010: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
5020: 20 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20 20 20   int addr2;..   
5030: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
5040: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61  mn==1 );.      a
5050: 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
5060: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
5070: 73 4e 75 6c 6c 2c 20 72 65 67 52 65 73 75 6c 74  sNull, regResult
5080: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69  );.      p->affi
5090: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 43 6f  nity = sqlite3Co
50a0: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
50b0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
50c0: 2c 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74  , pDest->affinit
50d0: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  y);.      if( pO
50e0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
50f0: 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c    /* At first gl
5100: 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74  ance you would t
5110: 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70  hink we could op
5120: 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20  timize out the. 
5130: 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20         ** ORDER 
5140: 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  BY in this case 
5150: 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20  since the order 
5160: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
5170: 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a  e set.        **
5180: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
5190: 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67  .  But there mig
51a0: 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c  ht be a LIMIT cl
51b0: 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20  ause, in which. 
51c0: 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
51d0: 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61  he order does ma
51e0: 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  tter */.        
51f0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
5200: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
5210: 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a   p, regResult);.
5220: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5230: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
5240: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
5250: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
5260: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5270: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
5280: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
5290: 31 2c 20 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e  1, r1, &p->affin
52a0: 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ity, 1);.       
52b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
52c0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
52d0: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a  rt, iParm, r1);.
52e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
52f0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
5300: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
5310: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
5320: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
5330: 61 64 64 72 32 29 3b 0a 20 20 20 20 20 20 62 72  addr2);.      br
5340: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
5350: 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78  /* If any row ex
5360: 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ist in the resul
5370: 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
5380: 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
5390: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
53a0: 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
53b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
53c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
53d0: 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d  nteger, 1, iParm
53e0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
53f0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
5400: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
5410: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
5420: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5430: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
5440: 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
5450: 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
5460: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
5470: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
5480: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
5490: 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
54a0: 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
54b0: 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
54c0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
54d0: 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
54e0: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
54f0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
5500: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
5510: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
5520: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
5530: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
5540: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c  se, pOrderBy, p,
5550: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
5560: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5570: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5580: 4f 70 32 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20  Op2(v, OP_Move, 
5590: 72 65 67 52 65 73 75 6c 74 2c 20 69 50 61 72 6d  regResult, iParm
55a0: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
55b0: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
55c0: 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
55d0: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
55e0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
55f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
5600: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
5610: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
5620: 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
5630: 53 65 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f  Send the data to
5640: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75   the callback fu
5650: 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73  nction or to a s
5660: 75 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74  ubroutine.  In t
5670: 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f  he.    ** case o
5680: 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20  f a subroutine, 
5690: 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  the subroutine i
56a0: 74 73 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73  tself is respons
56b0: 69 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20  ible for.    ** 
56c0: 70 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  popping the data
56d0: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e   from the stack.
56e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
56f0: 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a   SRT_Subroutine:
5700: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 61  .    case SRT_Ca
5710: 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20  llback: {.      
5720: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
5730: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
5740: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
5750: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
5760: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5770: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
5780: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
5790: 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b  t, nColumn, r1);
57a0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
57b0: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
57c0: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29  pOrderBy, p, r1)
57d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
57e0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
57f0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
5800: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65     }else if( eDe
5810: 73 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69  st==SRT_Subrouti
5820: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ne ){.        sq
5830: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5840: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
5850: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  iParm);.      }e
5860: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5870: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5880: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
5890: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
58a0: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  mn);.      }.   
58b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
58c0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
58d0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
58e0: 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  R).    /* Discar
58f0: 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  d the results.  
5900: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
5910: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
5920: 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a  ts inside.    **
5930: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54   the body of a T
5940: 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72  RIGGER.  The pur
5950: 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c  pose of such sel
5960: 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a  ects is to call.
5970: 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69      ** user-defi
5980: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ned functions th
5990: 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66  at have side eff
59a0: 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ects.  We do not
59b0: 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f   care.    ** abo
59c0: 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  ut the actual re
59d0: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
59e0: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
59f0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
5a00: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
5a10: 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20  SRT_Discard );. 
5a20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5a30: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
5a40: 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
5a50: 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
5a60: 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
5a70: 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  eached..  */.  i
5a80: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20  f( p->iLimit>=0 
5a90: 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  && pOrderBy==0 )
5aa0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
5ab0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
5ac0: 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  dImm, p->iLimit,
5ad0: 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   -1);.    sqlite
5ae0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5af0: 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  P_IfZero, p->iLi
5b00: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  mit, iBreak);.  
5b10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
5b20: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
5b30: 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ist, generate a 
5b40: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
5b50: 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a  e that records.*
5b60: 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * the collating 
5b70: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63  sequence for eac
5b80: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
5b90: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20  that expression 
5ba0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  list..**.** If t
5bb0: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61  he ExprList is a
5bc0: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
5bd0: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68  OUP BY clause th
5be0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  en the resulting
5bf0: 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  .** KeyInfo stru
5c00: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
5c10: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
5c20: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20  izing a virtual 
5c30: 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c  index to.** impl
5c40: 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73  ement that claus
5c50: 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c  e.  If the ExprL
5c60: 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  ist is the resul
5c70: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
5c80: 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65  T.** then the Ke
5c90: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
5ca0: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
5cb0: 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  or initializing 
5cc0: 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64  a virtual.** ind
5cd0: 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ex to implement 
5ce0: 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e  a DISTINCT test.
5cf0: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
5d00: 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f  hold the KeyInfo
5d10: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62   structure is ob
5d20: 74 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  tain from malloc
5d30: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  .  The calling.*
5d40: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  * function is re
5d50: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65  sponsible for se
5d60: 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73  eing that this s
5d70: 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e  tructure is even
5d80: 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e  tually.** freed.
5d90: 20 20 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66    Add the KeyInf
5da0: 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  o structure to t
5db0: 68 65 20 50 34 20 66 69 65 6c 64 20 6f 66 20 61  he P4 field of a
5dc0: 6e 20 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a  n opcode using.*
5dd0: 2a 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  * P4_KEYINFO_HAN
5de0: 44 4f 46 46 20 69 73 20 74 68 65 20 75 73 75 61  DOFF is the usua
5df0: 6c 20 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67  l way of dealing
5e00: 20 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73   with this..*/.s
5e10: 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b  tatic KeyInfo *k
5e20: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
5e30: 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  st(Parse *pParse
5e40: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
5e50: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  t){.  sqlite3 *d
5e60: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
5e70: 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b    int nExpr;.  K
5e80: 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20  eyInfo *pInfo;. 
5e90: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
5ea0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
5eb0: 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20  int i;..  nExpr 
5ec0: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
5ed0: 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65    pInfo = sqlite
5ee0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
5ef0: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29  , sizeof(*pInfo)
5f00: 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66   + nExpr*(sizeof
5f10: 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b  (CollSeq*)+1) );
5f20: 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a  .  if( pInfo ){.
5f30: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74      pInfo->aSort
5f40: 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49  Order = (u8*)&pI
5f50: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72  nfo->aColl[nExpr
5f60: 5d 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46  ];.    pInfo->nF
5f70: 69 65 6c 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20  ield = nExpr;.  
5f80: 20 20 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45    pInfo->enc = E
5f90: 4e 43 28 64 62 29 3b 0a 20 20 20 20 66 6f 72 28  NC(db);.    for(
5fa0: 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  i=0, pItem=pList
5fb0: 2d 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  ->a; i<nExpr; i+
5fc0: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
5fd0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
5fe0: 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  l;.      pColl =
5ff0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
6000: 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
6010: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
6020: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
6030: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64         pColl = d
6040: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
6050: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66      }.      pInf
6060: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  o->aColl[i] = pC
6070: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f  oll;.      pInfo
6080: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
6090: 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  = pItem->sortOrd
60a0: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  er;.    }.  }.  
60b0: 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a  return pInfo;.}.
60c0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
60d0: 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65  nner loop was ge
60e0: 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20  nerated using a 
60f0: 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42  non-null pOrderB
6100: 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74  y argument,.** t
6110: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
6120: 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61  were placed in a
6130: 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20   sorter.  After 
6140: 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d  the loop is term
6150: 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65  inated.** we nee
6160: 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72  d to run the sor
6170: 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74  ter and output t
6180: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65  he results.  The
6190: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f   following.** ro
61a0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
61b0: 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20  the code needed 
61c0: 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73  to do that..*/.s
61d0: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
61e0: 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50  ateSortTail(.  P
61f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6200: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
6210: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
6220: 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *p,        /* Th
6230: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
6240: 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c  nt */.  Vdbe *v,
6250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
6260: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
6270: 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69  this VDBE */.  i
6280: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
6290: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
62a0: 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f  lumns of data */
62b0: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
62c0: 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68  Dest /* Write th
62d0: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
62e0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
62f0: 74 20 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56  t brk = sqlite3V
6300: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
6310: 0a 20 20 69 6e 74 20 63 6f 6e 74 20 3d 20 73 71  .  int cont = sq
6320: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
6330: 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64  el(v);.  int add
6340: 72 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  r;.  int iTab;. 
6350: 20 69 6e 74 20 70 73 65 75 64 6f 54 61 62 20 3d   int pseudoTab =
6360: 20 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   0;.  ExprList *
6370: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
6380: 72 64 65 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65  rderBy;..  int e
6390: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
63a0: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
63b0: 20 3d 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b   = pDest->iParm;
63c0: 0a 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a  ..  int regRow;.
63d0: 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a    int regRowid;.
63e0: 0a 20 20 69 54 61 62 20 3d 20 70 4f 72 64 65 72  .  iTab = pOrder
63f0: 42 79 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20  By->iECursor;.  
6400: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
6410: 61 6c 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73 74  allback || eDest
6420: 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65  ==SRT_Subroutine
6430: 20 29 7b 0a 20 20 20 20 70 73 65 75 64 6f 54 61   ){.    pseudoTa
6440: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
6450: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ++;.    sqlite3V
6460: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6470: 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 73 65 75  OpenPseudo, pseu
6480: 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73  doTab, 0);.    s
6490: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
64a0: 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c  (v, OP_SetNumCol
64b0: 75 6d 6e 73 2c 20 70 73 65 75 64 6f 54 61 62 2c  umns, pseudoTab,
64c0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 7d 0a 20   nColumn);.  }. 
64d0: 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69   addr = 1 + sqli
64e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
64f0: 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20   OP_Sort, iTab, 
6500: 62 72 6b 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73  brk);.  codeOffs
6510: 65 74 28 76 2c 20 70 2c 20 63 6f 6e 74 29 3b 0a  et(v, p, cont);.
6520: 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74    regRow = sqlit
6530: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
6540: 72 73 65 29 3b 0a 20 20 72 65 67 52 6f 77 69 64  rse);.  regRowid
6550: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
6560: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
6570: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6580: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
6590: 69 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e  iTab, pOrderBy->
65a0: 6e 45 78 70 72 20 2b 20 31 2c 20 72 65 67 52 6f  nExpr + 1, regRo
65b0: 77 29 3b 0a 20 20 73 77 69 74 63 68 28 20 65 44  w);.  switch( eD
65c0: 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20  est ){.    case 
65d0: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
65e0: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
65f0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
6600: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6610: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
6620: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
6630: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6640: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
6650: 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  rt, iParm, regRo
6660: 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  w, regRowid);.  
6670: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
6680: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
6690: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
66a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
66b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
66c0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
66d0: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
66e0: 20 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20       int j1;.   
66f0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
6700: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 6a  mn==1 );.      j
6710: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
6720: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp1(v, OP_IsNu
6730: 6c 6c 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20  ll, regRow);.   
6740: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6750: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
6760: 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 31  ecord, regRow, 1
6770: 2c 20 72 65 67 52 6f 77 2c 20 26 70 2d 3e 61 66  , regRow, &p->af
6780: 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20  finity, 1);.    
6790: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
67a0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
67b0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
67c0: 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ow);.      sqlit
67d0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
67e0: 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , j1);.      bre
67f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6800: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
6810: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
6820: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
6830: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6840: 32 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 72 65  2(v, OP_Move, re
6850: 67 52 6f 77 2c 20 69 50 61 72 6d 29 3b 0a 20 20  gRow, iParm);.  
6860: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
6870: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
6880: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
6890: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
68a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
68b0: 64 69 66 0a 20 20 20 20 63 61 73 65 20 53 52 54  dif.    case SRT
68c0: 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63  _Callback:.    c
68d0: 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69  ase SRT_Subrouti
68e0: 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ne: {.      int 
68f0: 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  i;.      sqlite3
6900: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6910: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
6920: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
6930: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6940: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 73  v, OP_Insert, ps
6950: 65 75 64 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c  eudoTab, regRow,
6960: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
6970: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
6980: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
6990: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
69a0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
69b0: 6d 6e 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 69  mn, pseudoTab, i
69c0: 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 29  , pDest->iMem+i)
69d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
69e0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
69f0: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
6a00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6a10: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
6a20: 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 4d 65  tRow, pDest->iMe
6a30: 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  m, nColumn);.   
6a40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6a50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6a60: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
6a70: 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20   0, iParm);.    
6a80: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6a90: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
6aa0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  lt: {.      /* D
6ab0: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
6ac0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6ad0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
6ae0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
6af0: 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73  se, regRow);.  s
6b00: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6b10: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
6b20: 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 4a 75  Rowid);..  /* Ju
6b30: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
6b40: 20 74 68 65 20 6c 6f 6f 70 20 77 68 65 6e 20 74   the loop when t
6b50: 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
6b60: 68 65 64 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  hed.  */.  if( p
6b70: 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20  ->iLimit>=0 ){. 
6b80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6b90: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
6ba0: 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31  m, p->iLimit, -1
6bb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6bc0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6bd0: 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  fZero, p->iLimit
6be0: 2c 20 62 72 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f  , brk);.  }..  /
6bf0: 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  * The bottom of 
6c00: 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  the loop.  */.  
6c10: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
6c20: 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29  veLabel(v, cont)
6c30: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
6c40: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
6c50: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20  , iTab, addr);. 
6c60: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
6c70: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29  lveLabel(v, brk)
6c80: 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  ;.  if( eDest==S
6c90: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c 20 65  RT_Callback || e
6ca0: 44 65 73 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75  Dest==SRT_Subrou
6cb0: 74 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  tine ){.    sqli
6cc0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6cd0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64   OP_Close, pseud
6ce0: 6f 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 7d  oTab, 0);.  }..}
6cf0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
6d00: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
6d10: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
6d20: 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e  the 'declaration
6d30: 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a   type' of the.**
6d40: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
6d50: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61  r. The string ma
6d60: 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20  y be treated as 
6d70: 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61  static by the ca
6d80: 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ller..**.** The 
6d90: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
6da0: 20 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61   is the exact da
6db0: 74 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f  tatype definitio
6dc0: 6e 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  n extracted from
6dd0: 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
6de0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
6df0: 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65  atement if the e
6e00: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
6e10: 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65  olumn. The.** de
6e20: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
6e30: 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64  or a ROWID field
6e40: 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61   is INTEGER. Exa
6e50: 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70  ctly when an exp
6e60: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  ression.** is co
6e70: 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d  nsidered a colum
6e80: 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78  n can be complex
6e90: 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65   in the presence
6ea0: 20 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20   of subqueries. 
6eb0: 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65  The.** result-se
6ec0: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  t expression in 
6ed0: 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
6ee0: 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74  wing SELECT stat
6ef0: 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f  ements is .** co
6f00: 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d  nsidered a colum
6f10: 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  n by this functi
6f20: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  on..**.**   SELE
6f30: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
6f40: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
6f50: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
6f60: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
6f70: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
6f80: 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  tbl);.**   SELEC
6f90: 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45  T abc FROM (SELE
6fa0: 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52  CT col AS abc FR
6fb0: 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20  OM tbl);.** .** 
6fc0: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
6fd0: 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70  type for any exp
6fe0: 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68  ression other th
6ff0: 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e  an a column is N
7000: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ULL..*/.static c
7010: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
7020: 6e 54 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e  nType(.  NameCon
7030: 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78  text *pNC, .  Ex
7040: 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e  pr *pExpr,.  con
7050: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
7060: 69 6e 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  inDb,.  const ch
7070: 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62  ar **pzOriginTab
7080: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
7090: 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a  *pzOriginCol.){.
70a0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54    char const *zT
70b0: 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ype = 0;.  char 
70c0: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62  const *zOriginDb
70d0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
70e0: 73 74 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d  st *zOriginTab =
70f0: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
7100: 20 2a 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30   *zOriginCol = 0
7110: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28  ;.  int j;.  if(
7120: 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 43   pExpr==0 || pNC
7130: 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  ->pSrcList==0 ) 
7140: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69  return 0;..  swi
7150: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
7160: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
7170: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
7180: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
7190: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
71a0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
71b0: 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20  umn. Locate the 
71c0: 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e  table the column
71d0: 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20   is being.      
71e0: 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
71f0: 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74  m in NameContext
7200: 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20  .pSrcList. This 
7210: 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61  table may be rea
7220: 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  l.      ** datab
7230: 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73  ase table or a s
7240: 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a  ubquery..      *
7250: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
7260: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
7270: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72      /* Table str
7280: 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73  ucture column is
7290: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
72a0: 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
72b0: 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *pS = 0;        
72c0: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74       /* Select t
72d0: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  he column is ext
72e0: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
72f0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
7300: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20  pExpr->iColumn; 
7310: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
7320: 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20  umn in pTab */. 
7330: 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20       while( pNC 
7340: 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
7350: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61      SrcList *pTa
7360: 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  bList = pNC->pSr
7370: 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66  cList;.        f
7380: 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73  or(j=0;j<pTabLis
7390: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
73a0: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
73b0: 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r!=pExpr->iTable
73c0: 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69  ;j++);.        i
73d0: 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  f( j<pTabList->n
73e0: 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Src ){.         
73f0: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
7400: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
7410: 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62         pS = pTab
7420: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65  List->a[j].pSele
7430: 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ct;.        }els
7440: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43  e{.          pNC
7450: 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20   = pNC->pNext;. 
7460: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7470: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ..      if( pTab
7480: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
7490: 2a 20 46 49 58 20 4d 45 3a 0a 20 20 20 20 20 20  * FIX ME:.      
74a0: 20 20 2a 2a 20 54 68 69 73 20 63 61 6e 20 6f 63    ** This can oc
74b0: 63 75 72 73 20 69 66 20 79 6f 75 20 68 61 76 65  curs if you have
74c0: 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20   something like 
74d0: 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 3b 22 20  "SELECT new.x;" 
74e0: 69 6e 73 69 64 65 0a 20 20 20 20 20 20 20 20 2a  inside.        *
74f0: 2a 20 61 20 74 72 69 67 67 65 72 2e 20 20 49 6e  * a trigger.  In
7500: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
7510: 20 79 6f 75 20 72 65 66 65 72 65 6e 63 65 20 74   you reference t
7520: 68 65 20 73 70 65 63 69 61 6c 20 22 6e 65 77 22  he special "new"
7530: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
7540: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
7550: 73 65 74 20 6f 66 20 61 20 73 65 6c 65 63 74 2e  set of a select.
7560: 20 20 57 65 20 64 6f 20 6e 6f 74 20 68 61 76 65    We do not have
7570: 20 61 20 67 6f 6f 64 20 77 61 79 0a 20 20 20 20   a good way.    
7580: 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e 64 20 74      ** to find t
7590: 68 65 20 61 63 74 75 61 6c 20 74 61 62 6c 65 20  he actual table 
75a0: 74 79 70 65 2c 20 73 6f 20 63 61 6c 6c 20 69 74  type, so call it
75b0: 20 22 54 45 58 54 22 2e 20 20 54 68 69 73 20 69   "TEXT".  This i
75c0: 73 20 72 65 61 6c 6c 79 0a 20 20 20 20 20 20 20  s really.       
75d0: 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 66   ** something of
75e0: 20 61 20 62 75 67 2c 20 62 75 74 20 49 20 64 6f   a bug, but I do
75f0: 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 74 6f   not know how to
7600: 20 66 69 78 20 69 74 2e 0a 20 20 20 20 20 20 20   fix it..       
7610: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
7620: 68 69 73 20 63 6f 64 65 20 64 6f 65 73 20 6e 6f  his code does no
7630: 74 20 70 72 6f 64 75 63 65 20 74 68 65 20 63 6f  t produce the co
7640: 72 72 65 63 74 20 61 6e 73 77 65 72 20 2d 20 69  rrect answer - i
7650: 74 20 6a 75 73 74 20 70 72 65 76 65 6e 74 73 0a  t just prevents.
7660: 20 20 20 20 20 20 20 20 2a 2a 20 61 20 73 65 67          ** a seg
7670: 66 61 75 6c 74 2e 20 20 53 65 65 20 74 69 63 6b  fault.  See tick
7680: 65 74 20 23 31 32 32 39 2e 0a 20 20 20 20 20 20  et #1229..      
7690: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 54 79    */.        zTy
76a0: 70 65 20 3d 20 22 54 45 58 54 22 3b 0a 20 20 20  pe = "TEXT";.   
76b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
76c0: 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
76d0: 74 28 20 70 54 61 62 20 29 3b 0a 20 20 20 20 20  t( pTab );.     
76e0: 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20   if( pS ){.     
76f0: 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65     /* The "table
7700: 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  " is actually a 
7710: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20  sub-select or a 
7720: 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d  view in the FROM
7730: 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
7740: 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ** of the SELECT
7750: 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75   statement. Retu
7760: 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rn the declarati
7770: 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67  on type and orig
7780: 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  in.        ** da
7790: 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ta for the resul
77a0: 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  t-set column of 
77b0: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a  the sub-select..
77c0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
77d0: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26     if( iCol>=0 &
77e0: 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73  & iCol<pS->pELis
77f0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
7800: 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c        /* If iCol
7810: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
7820: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ro, then the exp
7830: 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73  ression requests
7840: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
7850: 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73  * rowid of the s
7860: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65  ub-select or vie
7870: 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73 69  w. This expressi
7880: 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65  on is legal (see
7890: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74   .          ** t
78a0: 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32  est case misc2.2
78b0: 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20  .2) - it always 
78c0: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
78d0: 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  L..          */.
78e0: 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f            NameCo
78f0: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
7900: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
7910: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  S->pEList->a[iCo
7920: 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  l].pExpr;.      
7930: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
7940: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
7950: 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74         sNC.pNext
7960: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
7970: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
7980: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
7990: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
79a0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
79b0: 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72  &zOriginDb, &zOr
79c0: 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69  iginTab, &zOrigi
79d0: 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20  nCol); .        
79e0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
79f0: 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ( pTab->pSchema 
7a00: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
7a10: 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  real table */.  
7a20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
7a30: 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  S );.        if(
7a40: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
7a50: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
7a60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
7a70: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
7a80: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
7a90: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
7aa0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
7ab0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
7ac0: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
7ad0: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f         zOriginCo
7ae0: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
7af0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7b00: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
7b10: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
7b20: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
7b30: 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 70 54 61  zOriginCol = pTa
7b40: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
7b50: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ame;.        }. 
7b60: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 54 61         zOriginTa
7b70: 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  b = pTab->zName;
7b80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43  .        if( pNC
7b90: 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20  ->pParse ){.    
7ba0: 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
7bb0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
7bc0: 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65  ndex(pNC->pParse
7bd0: 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
7be0: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
7bf0: 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70 4e 43 2d  zOriginDb = pNC-
7c00: 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62  >pParse->db->aDb
7c10: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
7c20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7c30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7c40: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
7c50: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
7c60: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
7c70: 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  T: {.      /* Th
7c80: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
7c90: 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65  a sub-select. Re
7ca0: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
7cb0: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20  tion type and.  
7cc0: 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e      ** origin in
7cd0: 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c  fo for the singl
7ce0: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
7cf0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
7d00: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a  e SELECT.      *
7d10: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  * statement..   
7d20: 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65     */.      Name
7d30: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
7d40: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
7d50: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a  pExpr->pSelect;.
7d60: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
7d70: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  pS->pEList->a[0]
7d80: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 4e  .pExpr;.      sN
7d90: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
7da0: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43  >pSrc;.      sNC
7db0: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
7dc0: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
7dd0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
7de0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
7df0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
7e00: 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72  &zOriginDb, &zOr
7e10: 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69  iginTab, &zOrigi
7e20: 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72  nCol); .      br
7e30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
7e40: 66 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 70  f.  }.  .  if( p
7e50: 7a 4f 72 69 67 69 6e 44 62 20 29 7b 0a 20 20 20  zOriginDb ){.   
7e60: 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 69   assert( pzOrigi
7e70: 6e 54 61 62 20 26 26 20 70 7a 4f 72 69 67 69 6e  nTab && pzOrigin
7e80: 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72  Col );.    *pzOr
7e90: 69 67 69 6e 44 62 20 3d 20 7a 4f 72 69 67 69 6e  iginDb = zOrigin
7ea0: 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69  Db;.    *pzOrigi
7eb0: 6e 54 61 62 20 3d 20 7a 4f 72 69 67 69 6e 54 61  nTab = zOriginTa
7ec0: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e  b;.    *pzOrigin
7ed0: 43 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c  Col = zOriginCol
7ee0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
7ef0: 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Type;.}../*.** G
7f00: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
7f10: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
7f20: 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61  VDBE the declara
7f30: 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f  tion types of co
7f40: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
7f50: 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73  result set..*/.s
7f60: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
7f70: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a  ateColumnTypes(.
7f80: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
7f90: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
7fa0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
7fb0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
7fc0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
7fd0: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
7fe0: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
7ff0: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
8000: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
8010: 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  et */.){.  Vdbe 
8020: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
8030: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  be;.  int i;.  N
8040: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
8050: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
8060: 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43   pTabList;.  sNC
8070: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
8080: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
8090: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
80a0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
80b0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
80c0: 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Expr;.    const 
80d0: 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20  char *zOrigDb = 
80e0: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
80f0: 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  r *zOrigTab = 0;
8100: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
8110: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20  *zOrigCol = 0;. 
8120: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
8130: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
8140: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
8150: 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20  gDb, &zOrigTab, 
8160: 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20  &zOrigCol);..   
8170: 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73   /* The vdbe mus
8180: 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63  t make its own c
8190: 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
81a0: 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72  n-type and other
81b0: 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20   .    ** column 
81c0: 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73  specific strings
81d0: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63  , in case the sc
81e0: 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65  hema is reset be
81f0: 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  fore this.    **
8200: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
8210: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   is deleted..   
8220: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
8230: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8240: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c   i, COLNAME_DECL
8250: 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 50 34 5f  TYPE, zType, P4_
8260: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
8270: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
8280: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
8290: 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f  AME_DATABASE, zO
82a0: 72 69 67 44 62 2c 20 50 34 5f 54 52 41 4e 53 49  rigDb, P4_TRANSI
82b0: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
82c0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
82d0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41  v, i, COLNAME_TA
82e0: 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20 50  BLE, zOrigTab, P
82f0: 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  4_TRANSIENT);.  
8300: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8310: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8320: 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f  LNAME_COLUMN, zO
8330: 72 69 67 43 6f 6c 2c 20 50 34 5f 54 52 41 4e 53  rigCol, P4_TRANS
8340: 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  IENT);.  }.}../*
8350: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
8360: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
8370: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61   the VDBE the na
8380: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  mes of columns.*
8390: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
83a0: 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  set.  This infor
83b0: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
83c0: 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a  o provide the.**
83d0: 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20   azCol[] values 
83e0: 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e  in the callback.
83f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8400: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
8410: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
8420: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
8430: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
8440: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
8450: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
8460: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
8470: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
8480: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
8490: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
84a0: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20  ult set */.){.  
84b0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
84c0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
84d0: 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  , j;.  sqlite3 *
84e0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
84f0: 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73  .  int fullNames
8500: 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23  , shortNames;..#
8510: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8520: 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20  IT_EXPLAIN.  /* 
8530: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58  If this is an EX
8540: 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73  PLAIN, skip this
8550: 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70   step */.  if( p
8560: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
8570: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
8580: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
8590: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66  rt( v!=0 );.  if
85a0: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d  ( pParse->colNam
85b0: 65 73 53 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c  esSet || v==0 ||
85c0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
85d0: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50  d ) return;.  pP
85e0: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
85f0: 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d  t = 1;.  fullNam
8600: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
8610: 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
8620: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f  Names)!=0;.  sho
8630: 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  rtNames = (db->f
8640: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
8650: 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ortColNames)!=0;
8660: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
8670: 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69  tNumCols(v, pELi
8680: 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f  st->nExpr);.  fo
8690: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
86a0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
86b0: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70    Expr *p;.    p
86c0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
86d0: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
86e0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
86f0: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
8700: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20  a[i].zName ){.  
8710: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
8720: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
8730: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Name;.      sqli
8740: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8750: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8760: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  NAME, zName, str
8770: 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  len(zName));.   
8780: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
8790: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70   }.    if( p->op
87a0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
87b0: 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  TabList ){.     
87c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
87d0: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a      char *zCol;.
87e0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
87f0: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
8800: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
8810: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20  abList->nSrc && 
8820: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
8830: 43 75 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c  Cursor!=p->iTabl
8840: 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  e; j++){}.      
8850: 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69  assert( j<pTabLi
8860: 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20  st->nSrc );.    
8870: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
8880: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
8890: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
88a0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
88b0: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
88c0: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
88d0: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
88e0: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
88f0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
8900: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
8910: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
8920: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8930: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
8940: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
8950: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8960: 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20   !shortNames && 
8970: 21 66 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d  !fullNames && p-
8980: 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70  >span.z && p->sp
8990: 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  an.z[0] ){.     
89a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
89b0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
89c0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68  OLNAME_NAME, (ch
89d0: 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70  ar*)p->span.z, p
89e0: 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20  ->span.n);.     
89f0: 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e   }else if( fullN
8a00: 61 6d 65 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e  ames || (!shortN
8a10: 61 6d 65 73 20 26 26 20 70 54 61 62 4c 69 73 74  ames && pTabList
8a20: 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20  ->nSrc>1) ){.   
8a30: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
8a40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68   = 0;.        ch
8a50: 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20  ar *zTab;. .    
8a60: 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c      zTab = pTabL
8a70: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73  ist->a[j].zAlias
8a80: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 75  ;.        if( fu
8a90: 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d  llNames || zTab=
8aa0: 3d 30 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62  =0 ) zTab = pTab
8ab0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
8ac0: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
8ad0: 67 28 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20  g(&zName, zTab, 
8ae0: 22 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72  ".", zCol, (char
8af0: 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  *)0);.        sq
8b00: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8b10: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8b20: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 50  E_NAME, zName, P
8b30: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
8b40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8b50: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8b60: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8b70: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c  NAME_NAME, zCol,
8b80: 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a   strlen(zCol));.
8b90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
8ba0: 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20  e if( p->span.z 
8bb0: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20  && p->span.z[0] 
8bc0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8bd0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8be0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
8bf0: 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73 70 61  E, (char*)p->spa
8c00: 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b  n.z, p->span.n);
8c10: 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  .      /* sqlite
8c20: 33 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61  3VdbeCompressSpa
8c30: 63 65 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f 0a  ce(v, addr); */.
8c40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8c50: 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b   char zName[30];
8c60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8c70: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
8c80: 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29  || pTabList==0 )
8c90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
8ca0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
8cb0: 7a 4e 61 6d 65 29 2c 20 7a 4e 61 6d 65 2c 20 22  zName), zName, "
8cc0: 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b  column%d", i+1);
8cd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8ce0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8cf0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
8d00: 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   zName, 0);.    
8d10: 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65  }.  }.  generate
8d20: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72  ColumnTypes(pPar
8d30: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
8d40: 4c 69 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  List);.}..#ifnde
8d50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
8d60: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
8d70: 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20  .** Name of the 
8d80: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61  connection opera
8d90: 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72  tor, used for er
8da0: 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f  ror messages..*/
8db0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
8dc0: 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65  ar *selectOpName
8dd0: 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72  (int id){.  char
8de0: 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69   *z;.  switch( i
8df0: 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  d ){.    case TK
8e00: 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20  _ALL:       z = 
8e10: 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62  "UNION ALL";   b
8e20: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8e30: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d  K_INTERSECT: z =
8e40: 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20   "INTERSECT";   
8e50: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8e60: 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20  TK_EXCEPT:    z 
8e70: 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20  = "EXCEPT";     
8e80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
8e90: 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a  ult:           z
8ea0: 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20   = "UNION";     
8eb0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
8ec0: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69  eturn z;.}.#endi
8ed0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
8ee0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
8ef0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61   */../*.** Forwa
8f00: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
8f10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 65  /.static int pre
8f20: 70 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73  pSelectStmt(Pars
8f30: 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f  e*, Select*);../
8f40: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c  *.** Given a SEL
8f50: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67  ECT statement, g
8f60: 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20  enerate a Table 
8f70: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
8f80: 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20  escribes.** the 
8f90: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
8fa0: 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61  at SELECT..*/.Ta
8fb0: 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75  ble *sqlite3Resu
8fc0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61  ltSetOfSelect(Pa
8fd0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61  rse *pParse, cha
8fe0: 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c  r *zTabName, Sel
8ff0: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
9000: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
9010: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72  int i, j;.  Expr
9020: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
9030: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70  Column *aCol, *p
9040: 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Col;.  sqlite3 *
9050: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9060: 0a 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  ..  while( pSele
9070: 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
9080: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
9090: 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 72  pPrior;.  if( pr
90a0: 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61  epSelectStmt(pPa
90b0: 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b  rse, pSelect) ){
90c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
90d0: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
90e0: 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50  SelectResolve(pP
90f0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30  arse, pSelect, 0
9100: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
9110: 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20  0;.  }.  pTab = 
9120: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
9130: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
9140: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
9150: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
9160: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
9170: 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
9180: 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54  pTab->zName = zT
9190: 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 33  abName ? sqlite3
91a0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 54 61  DbStrDup(db, zTa
91b0: 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45  bName) : 0;.  pE
91c0: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
91d0: 70 45 4c 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e  pEList;.  pTab->
91e0: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
91f0: 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
9200: 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a  pTab->nCol>0 );.
9210: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 61    pTab->aCol = a
9220: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Col = sqlite3DbM
9230: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
9240: 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  zeof(pTab->aCol[
9250: 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b  0])*pTab->nCol);
9260: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
9270: 3d 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e  =aCol; i<pTab->n
9280: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
9290: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 2c 20  ){.    Expr *p, 
92a0: 2a 70 52 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  *pR;.    char *z
92b0: 54 79 70 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Type;.    char *
92c0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6e  zName;.    int n
92d0: 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 6c 53 65  Name;.    CollSe
92e0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 6e  q *pColl;.    in
92f0: 74 20 63 6e 74 3b 0a 20 20 20 20 4e 61 6d 65 43  t cnt;.    NameC
9300: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
9310: 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61  .    /* Get an a
9320: 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20  ppropriate name 
9330: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20  for the column. 
9340: 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45     */.    p = pE
9350: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
9360: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
9370: 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d  >pRight==0 || p-
9380: 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a  >pRight->token.z
9390: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74  ==0 || p->pRight
93a0: 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20  ->token.z[0]!=0 
93b0: 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d  );.    if( (zNam
93c0: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
93d0: 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  .zName)!=0 ){.  
93e0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
93f0: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e  lumn contains an
9400: 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72   "AS <name>" phr
9410: 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20  ase, use <name> 
9420: 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  as the name */. 
9430: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
9440: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
9450: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
9460: 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  se if( p->op==TK
9470: 5f 44 4f 54 20 0a 20 20 20 20 20 20 20 20 20 20  _DOT .          
9480: 20 20 20 20 26 26 20 28 70 52 3d 70 2d 3e 70 52      && (pR=p->pR
9490: 69 67 68 74 29 21 3d 30 20 26 26 20 70 52 2d 3e  ight)!=0 && pR->
94a0: 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74  token.z && pR->t
94b0: 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  oken.z[0] ){.   
94c0: 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
94d0: 73 20 6f 66 20 74 68 65 20 66 72 6f 6d 20 41 2e  s of the from A.
94e0: 42 20 75 73 65 20 42 20 61 73 20 74 68 65 20 6e  B use B as the n
94f0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61  ame */.      zNa
9500: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
9510: 6e 74 66 28 64 62 2c 20 22 25 54 22 2c 20 26 70  ntf(db, "%T", &p
9520: 52 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d  R->token);.    }
9530: 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61 6e  else if( p->span
9540: 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b  .z && p->span.z[
9550: 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55  0] ){.      /* U
9560: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  se the original 
9570: 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75  text of the colu
9580: 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73  mn expression as
9590: 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   its name */.   
95a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
95b0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
95c0: 54 22 2c 20 26 70 2d 3e 73 70 61 6e 29 3b 0a 20  T", &p->span);. 
95d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
95e0: 2f 2a 20 49 66 20 61 6c 6c 20 65 6c 73 65 20 66  /* If all else f
95f0: 61 69 6c 73 2c 20 6d 61 6b 65 20 75 70 20 61 20  ails, make up a 
9600: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e  name */.      zN
9610: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
9620: 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e  intf(db, "column
9630: 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 7d  %d", i+1);.    }
9640: 0a 20 20 20 20 69 66 28 20 21 7a 4e 61 6d 65 20  .    if( !zName 
9650: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
9660: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  led ){.      db-
9670: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
9680: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
9690: 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  _free(zName);.  
96a0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
96b0: 65 54 61 62 6c 65 28 70 54 61 62 29 3b 0a 20 20  eTable(pTab);.  
96c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
96d0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
96e0: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 0a  equote(zName);..
96f0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
9700: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
9710: 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20   is unique.  If 
9720: 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  the name is not 
9730: 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61  unique,.    ** a
9740: 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20  ppend a integer 
9750: 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74  to the name so t
9760: 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75  hat it becomes u
9770: 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  nique..    */.  
9780: 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e    nName = strlen
9790: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  (zName);.    for
97a0: 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a  (j=cnt=0; j<i; j
97b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
97c0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43  qlite3StrICmp(aC
97d0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  ol[j].zName, zNa
97e0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
97f0: 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d    zName[nName] =
9800: 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   0;.        zNam
9810: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
9820: 74 66 28 64 62 2c 20 22 25 7a 3a 25 64 22 2c 20  tf(db, "%z:%d", 
9830: 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20  zName, ++cnt);. 
9840: 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20         j = -1;. 
9850: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
9860: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
9870: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
9880: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  Col->zName = zNa
9890: 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20  me;..    /* Get 
98a0: 74 68 65 20 74 79 70 65 6e 61 6d 65 2c 20 74 79  the typename, ty
98b0: 70 65 20 61 66 66 69 6e 69 74 79 2c 20 61 6e 64  pe affinity, and
98c0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
98d0: 6e 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20  nce for the.    
98e0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a  ** column..    *
98f0: 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
9900: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
9910: 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  ));.    sNC.pSrc
9920: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
9930: 70 53 72 63 3b 0a 20 20 20 20 7a 54 79 70 65 20  pSrc;.    zType 
9940: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
9950: 70 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65  p(db, columnType
9960: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
9970: 30 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a  0));.    pCol->z
9980: 54 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20  Type = zType;.  
9990: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
99a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
99b0: 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 70  finity(p);.    p
99c0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
99d0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
99e0: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , p);.    if( pC
99f0: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
9a00: 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  l->zColl = sqlit
9a10: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
9a20: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
9a30: 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e    }.  }.  pTab->
9a40: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65  iPKey = -1;.  re
9a50: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
9a60: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 53 45  .** Prepare a SE
9a70: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66  LECT statement f
9a80: 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 62 79  or processing by
9a90: 20 64 6f 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   doing the follo
9aa0: 77 69 6e 67 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a  wing.** things:.
9ab0: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61  **.**    (1)  Ma
9ac0: 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72  ke sure VDBE cur
9ad0: 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
9ae0: 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
9af0: 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20  o every.**      
9b00: 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68     element of th
9b10: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
9b20: 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c  *.**    (2)  Fil
9b30: 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
9b40: 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
9b50: 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
9b60: 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
9b70: 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20     defines FROM 
9b80: 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69  clause.  When vi
9b90: 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  ews appear in th
9ba0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a  e FROM clause,.*
9bb0: 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
9bc0: 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
9bd0: 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
9be0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
9bf0: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
9c00: 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
9c10: 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
9c20: 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
9c30: 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
9c40: 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
9c50: 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
9c60: 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
9c70: 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
9c80: 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
9c90: 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
9ca0: 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
9cb0: 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
9cc0: 72 65 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  resistent repres
9cd0: 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
9ce0: 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
9cf0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41  .**.**    (3)  A
9d00: 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
9d10: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
9d20: 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e  accomodate the N
9d30: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a  ATURAL keyword.*
9d40: 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69  *         on joi
9d50: 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e  ns and the ON an
9d60: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  d USING clause o
9d70: 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20  f joins..**.**  
9d80: 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20    (4)  Scan the 
9d90: 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
9da0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
9db0: 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69  t (pEList) looki
9dc0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  ng.**         fo
9dd0: 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
9de0: 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20  he "*" operator 
9df0: 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f  or the TABLE.* o
9e00: 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20  perator..**     
9e10: 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78      If found, ex
9e20: 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f  pand each "*" to
9e30: 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
9e40: 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a   in every table.
9e50: 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54  **         and T
9e60: 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65  ABLE.* to be eve
9e70: 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42  ry column in TAB
9e80: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  LE..**.** Return
9e90: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20   0 on success.  
9ea0: 49 66 20 74 68 65 72 65 20 61 72 65 20 70 72 6f  If there are pro
9eb0: 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20  blems, leave an 
9ec0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
9ed0: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
9ee0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
9ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
9f00: 65 70 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72  epSelectStmt(Par
9f10: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
9f20: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c  ct *p){.  int i,
9f30: 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63   j, k, rc;.  Src
9f40: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
9f50: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
9f60: 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
9f70: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
9f80: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
9f90: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
9fa0: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e   if( p==0 || p->
9fb0: 70 53 72 63 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  pSrc==0 || db->m
9fc0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
9fd0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
9fe0: 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
9ff0: 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
a000: 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  = p->pEList;..  
a010: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72  /* Make sure cur
a020: 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
a030: 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
a040: 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  o all entries in
a050: 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
a060: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c  lause of the SEL
a070: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
a080: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63   */.  sqlite3Src
a090: 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
a0a0: 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72  s(pParse, p->pSr
a0b0: 63 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75  c);..  /* Look u
a0c0: 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61  p every table na
a0d0: 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
a0e0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65  clause of the se
a0f0: 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61  lect.  If.  ** a
a100: 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  n entry of the F
a110: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20  ROM clause is a 
a120: 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64  subquery instead
a130: 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76   of a table or v
a140: 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63  iew,.  ** then c
a150: 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e  reate a transien
a160: 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
a170: 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  e to describe th
a180: 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f  e subquery..  */
a190: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f  .  for(i=0, pFro
a1a0: 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
a1b0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
a1c0: 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
a1d0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
a1e0: 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
a1f0: 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20  pTab!=0 ){.     
a200: 20 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65   /* This stateme
a210: 6e 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  nt has already b
a220: 65 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54  een prepared.  T
a230: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
a240: 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66        ** to go f
a250: 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20  urther. */.     
a260: 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b   assert( i==0 );
a270: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
a280: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
a290: 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  From->zName==0 )
a2a0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
a2b0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
a2c0: 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
a2d0: 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
a2e0: 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
a2f0: 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
a300: 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  rt( pFrom->pSele
a310: 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ct!=0 );.      i
a320: 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73  f( pFrom->zAlias
a330: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
a340: 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20  From->zAlias =. 
a350: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a360: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c  MPrintf(db, "sql
a370: 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f  ite_subquery_%p_
a380: 22 2c 20 28 76 6f 69 64 2a 29 70 46 72 6f 6d 2d  ", (void*)pFrom-
a390: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
a3a0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
a3b0: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
a3c0: 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  );.      pFrom->
a3d0: 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20  pTab = pTab = . 
a3e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
a3f0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
a400: 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 2d 3e 7a  pParse, pFrom->z
a410: 41 6c 69 61 73 2c 20 70 46 72 6f 6d 2d 3e 70 53  Alias, pFrom->pS
a420: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66  elect);.      if
a430: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
a440: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
a450: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
a460: 54 68 65 20 69 73 45 70 68 65 6d 20 66 6c 61 67  The isEphem flag
a470: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
a480: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
a490: 75 72 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20  ure has been.   
a4a0: 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c     ** dynamicall
a4b0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  y allocated and 
a4c0: 6d 61 79 20 62 65 20 66 72 65 65 64 20 61 74 20  may be freed at 
a4d0: 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74  any time.  In ot
a4e0: 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20  her words,.     
a4f0: 20 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20   ** pTab is not 
a500: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65  pointing to a pe
a510: 72 73 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73  rsistent table s
a520: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
a530: 66 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70  fines.      ** p
a540: 61 72 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d  art of the schem
a550: 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62  a. */.      pTab
a560: 2d 3e 69 73 45 70 68 65 6d 20 3d 20 31 3b 0a 23  ->isEphem = 1;.#
a570: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
a580: 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64  .      /* An ord
a590: 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76  inary table or v
a5a0: 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  iew name in the 
a5b0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
a5c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
a5d0: 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
a5e0: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
a5f0: 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20   = pTab = .     
a600: 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65     sqlite3Locate
a610: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 30 2c 70  Table(pParse,0,p
a620: 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f  From->zName,pFro
a630: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
a640: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
a650: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
a660: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
a670: 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
a680: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
a690: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
a6a0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51   || !defined (SQ
a6b0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
a6c0: 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66  LTABLE).      if
a6d0: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
a6e0: 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  || IsVirtual(pTa
a6f0: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  b) ){.        /*
a700: 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20 69   We reach here i
a710: 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
a720: 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20  e is a really a 
a730: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20  view */.        
a740: 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
a750: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
a760: 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
a770: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
a780: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
a790: 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d       /* If pFrom
a7a0: 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 69 74 20  ->pSelect!=0 it 
a7b0: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
a7c0: 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20 20 20  ling with a.    
a7d0: 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69 74 68      ** view with
a7e0: 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68 65 20  in a view.  The 
a7f0: 53 45 4c 45 43 54 20 73 74 72 75 63 74 75 72 65  SELECT structure
a800: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
a810: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70  n.        ** cop
a820: 69 65 64 20 62 79 20 74 68 65 20 6f 75 74 65 72  ied by the outer
a830: 20 76 69 65 77 20 73 6f 20 77 65 20 63 61 6e 20   view so we can 
a840: 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20 73 74  skip the copy st
a850: 65 70 20 68 65 72 65 0a 20 20 20 20 20 20 20 20  ep here.        
a860: 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ** in the inner 
a870: 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f  view..        */
a880: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72  .        if( pFr
a890: 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
a8a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f  {.          pFro
a8b0: 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
a8c0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
a8d0: 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 29  , pTab->pSelect)
a8e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a8f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
a900: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
a910: 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
a920: 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
a930: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
a940: 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
a950: 66 28 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  f( sqliteProcess
a960: 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20  Join(pParse, p) 
a970: 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f  ) return 1;..  /
a980: 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
a990: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
a9a0: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
a9b0: 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
a9c0: 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
a9d0: 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
a9e0: 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
a9f0: 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
aa00: 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
aa10: 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
aa20: 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
aa30: 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
aa40: 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
aa50: 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
aa60: 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f  e TK_ALL operato
aa70: 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
aa80: 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
aa90: 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e  the column list.
aaa0: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
aab0: 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61  ing code just ha
aac0: 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
aad0: 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f  TK_ALL expressio
aae0: 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20  ns and expand.  
aaf0: 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74  ** each one to t
ab00: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63  he list of all c
ab10: 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
ab20: 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
ab30: 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
ab40: 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
ab50: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
ab60: 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
ab70: 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
ab80: 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
ab90: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
aba0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
abb0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d  {.    Expr *pE =
abc0: 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45   pEList->a[k].pE
abd0: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
abe0: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
abf0: 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  eak;.    if( pE-
ac00: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
ac10: 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45 2d  E->pRight && pE-
ac20: 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
ac30: 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20  ALL.         && 
ac40: 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70 45 2d  pE->pLeft && pE-
ac50: 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
ac60: 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  D ) break;.  }. 
ac70: 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b   rc = 0;.  if( k
ac80: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
ac90: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
aca0: 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
acb0: 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
acc0: 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
acd0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
ace0: 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
acf0: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
ad00: 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
ad10: 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
ad20: 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
ad30: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
ad40: 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
ad50: 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
ad60: 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
ad70: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
ad80: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
ad90: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
ada0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
adb0: 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ags = pParse->db
adc0: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  ->flags;.    int
add0: 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c   longNames = (fl
ade0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
adf0: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 20 26 26  lColNames)!=0 &&
ae00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ae10: 20 20 20 20 20 20 20 28 66 6c 61 67 73 20 26 20         (flags & 
ae20: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
ae30: 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66  ames)==0;..    f
ae40: 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
ae50: 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
ae60: 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
ae70: 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
ae80: 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b    if( pE->op!=TK
ae90: 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20 20 20 20  _ALL &&.        
aea0: 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44     (pE->op!=TK_D
aeb0: 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  OT || pE->pRight
aec0: 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  ==0 || pE->pRigh
aed0: 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29  t->op!=TK_ALL) )
aee0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
aef0: 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70  s particular exp
af00: 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ression does not
af10: 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
af20: 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nded..        */
af30: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
af40: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
af50: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
af60: 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c 20  ew, a[k].pExpr, 
af70: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
af80: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
af90: 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
afa0: 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
afb0: 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20   a[k].zName;.   
afc0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
afd0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
afe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
aff0: 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
b000: 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61          a[k].zNa
b010: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  me = 0;.      }e
b020: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
b030: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
b040: 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54  is a "*" or a "T
b050: 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64  ABLE.*" and need
b060: 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20  s to be.        
b070: 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a  ** expanded. */.
b080: 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c          int tabl
b090: 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  eSeen = 0;      
b0a0: 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e  /* Set to 1 when
b0b0: 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a   TABLE matches *
b0c0: 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  /.        char *
b0d0: 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  zTName;         
b0e0: 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
b0f0: 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
b100: 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
b110: 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
b120: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
b130: 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71 6c      zTName = sql
b140: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
b150: 6e 28 64 62 2c 20 26 70 45 2d 3e 70 4c 65 66 74  n(db, &pE->pLeft
b160: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
b170: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b180: 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20     zTName = 0;. 
b190: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b1a0: 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
b1b0: 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
b1c0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
b1d0: 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
b1e0: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
b1f0: 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
b200: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  b;.          cha
b210: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46  r *zTabName = pF
b220: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  rom->zAlias;.   
b230: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
b240: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61  ame==0 || zTabNa
b250: 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20  me[0]==0 ){ .   
b260: 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d           zTabNam
b270: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
b280: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b290: 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
b2a0: 65 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d  e && (zTabName==
b2b0: 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  0 || zTabName[0]
b2c0: 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ==0 || .        
b2d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b2e0: 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20  StrICmp(zTName, 
b2f0: 7a 54 61 62 4e 61 6d 65 29 21 3d 30 29 20 29 7b  zTabName)!=0) ){
b300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
b310: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
b320: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61 62   }.          tab
b330: 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  leSeen = 1;.    
b340: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
b350: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
b360: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  ){.            E
b370: 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 52 69  xpr *pExpr, *pRi
b380: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
b390: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
b3a0: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
b3b0: 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  me;..           
b3c0: 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20   /* If a column 
b3d0: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69  is marked as 'hi
b3e0: 64 64 65 6e 27 20 28 63 75 72 72 65 6e 74 6c 79  dden' (currently
b3f0: 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20   only possible. 
b400: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f             ** fo
b410: 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  r virtual tables
b420: 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64  ), do not includ
b430: 65 20 69 74 20 69 6e 20 74 68 65 20 65 78 70 61  e it in the expa
b440: 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  nded.           
b450: 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c   ** result-set l
b460: 69 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ist..           
b470: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
b480: 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75  if( IsHiddenColu
b490: 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  mn(&pTab->aCol[j
b4a0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
b4b0: 20 20 20 20 61 73 73 65 72 74 28 49 73 56 69 72      assert(IsVir
b4c0: 74 75 61 6c 28 70 54 61 62 29 29 3b 0a 20 20 20  tual(pTab));.   
b4d0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
b4e0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
b4f0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
b500: 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20  if( i>0 ){.     
b510: 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
b520: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
b530: 65 66 74 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  eft = &pTabList-
b540: 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20  >a[i-1];.       
b550: 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 65 66         if( (pLef
b560: 74 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  t[1].jointype & 
b570: 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26  JT_NATURAL)!=0 &
b580: 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
b590: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
b5a0: 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70 54 61  Index(pLeft->pTa
b5b0: 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  b, zName)>=0 ){.
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5d0: 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20  /* In a NATURAL 
b5e0: 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a  join, omit the j
b5f0: 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  oin columns from
b600: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
b610: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f        ** table o
b620: 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
b630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
b640: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
b650: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b660: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
b670: 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 4c  e3IdListIndex(pL
b680: 65 66 74 5b 31 5d 2e 70 55 73 69 6e 67 2c 20 7a  eft[1].pUsing, z
b690: 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
b6b0: 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20  n a join with a 
b6c0: 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d  USING clause, om
b6d0: 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  it columns in th
b6e0: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
b6f0: 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73    ** using claus
b700: 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  e from the table
b710: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a   on the right. *
b720: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
b730: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
b740: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b750: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b760: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73        pRight = s
b770: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
b780: 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  se, TK_ID, 0, 0,
b790: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
b7a0: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
b7b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
b7c0: 20 20 20 20 73 65 74 51 75 6f 74 65 64 54 6f 6b      setQuotedTok
b7d0: 65 6e 28 70 50 61 72 73 65 2c 20 26 70 52 69 67  en(pParse, &pRig
b7e0: 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e 61 6d 65  ht->token, zName
b7f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
b800: 66 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 28  f( zTabName && (
b810: 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61  longNames || pTa
b820: 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29  bList->nSrc>1) )
b830: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b840: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
b850: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
b860: 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  e, TK_ID, 0, 0, 
b870: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
b880: 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
b890: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
b8a0: 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
b8b0: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
b8c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
b8d0: 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r==0 ) break;.  
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 51              setQ
b8f0: 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50 61 72 73  uotedToken(pPars
b900: 65 2c 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  e, &pLeft->token
b910: 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20  , zTabName);.   
b920: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54 6f             setTo
b930: 6b 65 6e 28 26 70 45 78 70 72 2d 3e 73 70 61 6e  ken(&pExpr->span
b940: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
b950: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
b960: 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
b970: 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65   zTabName, zName
b980: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
b990: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79    pExpr->span.dy
b9a0: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
b9b0: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
b9c0: 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  n.z = 0;.       
b9d0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
b9e0: 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  ken.n = 0;.     
b9f0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
ba00: 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20  token.dyn = 0;. 
ba10: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
ba20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
ba30: 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
ba50: 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70  xpr->span = pExp
ba60: 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  r->token;.      
ba70: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
ba80: 70 61 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20  pan.dyn = 0;.   
ba90: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
baa0: 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
bab0: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
bac0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
bad0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
bae0: 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
baf0: 20 70 45 78 70 72 2c 20 26 70 45 78 70 72 2d 3e   pExpr, &pExpr->
bb00: 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  span);.         
bb10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bb20: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
bb30: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
bb40: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
bb50: 77 2c 20 70 45 78 70 72 2c 20 26 70 52 69 67 68  w, pExpr, &pRigh
bb60: 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  t->token);.     
bb70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bb80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
bb90: 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
bba0: 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
bbb0: 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
bbc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
bbd0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
bbe0: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
bbf0: 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
bc00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
bc10: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
bc20: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
bc30: 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
bc40: 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
bc50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
bc60: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
bc70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bc80: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 4e  sqlite3_free(zTN
bc90: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
bca0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
bcb0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45  xprListDelete(pE
bcc0: 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45  List);.    p->pE
bcd0: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
bce0: 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
bcf0: 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   && p->pEList->n
bd00: 45 78 70 72 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Expr>SQLITE_MAX_
bd10: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 73 71  COLUMN ){.    sq
bd20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
bd30: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
bd40: 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
bd50: 74 20 73 65 74 22 29 3b 0a 20 20 20 20 72 63 20  t set");.    rc 
bd60: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
bd70: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61    }.  if( db->ma
bd80: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
bd90: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
bda0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
bdb0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  n rc;.}../*.** p
bdc0: 45 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  E is a pointer t
bdd0: 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  o an expression 
bde0: 77 68 69 63 68 20 69 73 20 61 20 73 69 6e 67 6c  which is a singl
bdf0: 65 20 74 65 72 6d 20 69 6e 0a 2a 2a 20 4f 52 44  e term in.** ORD
be00: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
be10: 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  Y clause..**.** 
be20: 49 66 20 70 45 20 65 76 61 6c 75 61 74 65 73 20  If pE evaluates 
be30: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  to an integer co
be40: 6e 73 74 61 6e 74 20 69 2c 20 74 68 65 6e 20 72  nstant i, then r
be50: 65 74 75 72 6e 20 69 2e 0a 2a 2a 20 54 68 69 73  eturn i..** This
be60: 20 69 73 20 61 6e 20 69 6e 64 69 63 61 74 69 6f   is an indicatio
be70: 6e 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  n to the caller 
be80: 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73  that it should s
be90: 6f 72 74 0a 2a 2a 20 62 79 20 74 68 65 20 69 2d  ort.** by the i-
bea0: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  th column of the
beb0: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a   result set..**.
bec0: 2a 2a 20 49 66 20 70 45 20 69 73 20 61 20 77 65  ** If pE is a we
bed0: 6c 6c 2d 66 6f 72 6d 65 64 20 65 78 70 72 65 73  ll-formed expres
bee0: 73 69 6f 6e 20 61 6e 64 20 74 68 65 20 53 45 4c  sion and the SEL
bef0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
bf00: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6f 75 6e 64   is not compound
bf10: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 2e  , then return 0.
bf20: 20 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73    This indicates
bf30: 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   to the.** calle
bf40: 72 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64  r that it should
bf50: 20 73 6f 72 74 20 62 79 20 74 68 65 20 76 61 6c   sort by the val
bf60: 75 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ue of the ORDER 
bf70: 42 59 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  BY.** expression
bf80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ..**.** If the S
bf90: 45 4c 45 43 54 20 69 73 20 63 6f 6d 70 6f 75 6e  ELECT is compoun
bfa0: 64 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20  d, then attempt 
bfb0: 74 6f 20 6d 61 74 63 68 20 70 45 20 61 67 61 69  to match pE agai
bfc0: 6e 73 74 0a 2a 2a 20 72 65 73 75 6c 74 20 73 65  nst.** result se
bfd0: 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
bfe0: 20 6c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43   left-most SELEC
bff0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65  T statement.  Re
c000: 74 75 72 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65  turn.** the inde
c010: 78 20 69 20 6f 66 20 74 68 65 20 6d 61 74 63 68  x i of the match
c020: 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20 61 73 20 61  ing column, as a
c030: 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20  n indication to 
c040: 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 74  the .** caller t
c050: 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73 6f  hat it should so
c060: 72 74 20 62 79 20 74 68 65 20 69 2d 74 68 20 63  rt by the i-th c
c070: 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 65 72 65  olumn.  If there
c080: 20 69 73 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 2c   is.** no match,
c090: 20 72 65 74 75 72 6e 20 2d 31 20 61 6e 64 20 6c   return -1 and l
c0a0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
c0b0: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
c0c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
c0d0: 61 74 63 68 4f 72 64 65 72 42 79 54 65 72 6d 54  atchOrderByTermT
c0e0: 6f 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  oExprList(.  Par
c0f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
c100: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
c110: 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  xt for error mes
c120: 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63  sages */.  Selec
c130: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a  t *pSelect,   /*
c140: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
c150: 65 6d 65 6e 74 20 77 69 74 68 20 74 68 65 20 4f  ement with the O
c160: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
c170: 2f 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 20 20  /.  Expr *pE,   
c180: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
c190: 65 63 69 66 69 63 20 4f 52 44 45 52 20 42 59 20  ecific ORDER BY 
c1a0: 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 64  term */.  int id
c1b0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
c1c0: 57 68 65 6e 20 4f 52 44 45 52 20 42 59 20 74 65  When ORDER BY te
c1d0: 72 6d 20 69 73 20 74 68 69 73 20 2a 2f 0a 20 20  rm is this */.  
c1e0: 69 6e 74 20 69 73 43 6f 6d 70 6f 75 6e 64 2c 20  int isCompound, 
c1f0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
c200: 69 73 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  is is a compound
c210: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 75 38 20   SELECT */.  u8 
c220: 2a 70 48 61 73 41 67 67 20 20 20 20 20 20 20 20  *pHasAgg        
c230: 2f 2a 20 54 72 75 65 20 69 66 20 65 78 70 72 65  /* True if expre
c240: 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61  ssion contains a
c250: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
c260: 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ns */.){.  int i
c270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
c280: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
c290: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
c2a0: 69 73 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6c  ist;  /* The col
c2b0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 72 65 73 75  umns of the resu
c2c0: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 4e 61 6d 65  lt set */.  Name
c2d0: 43 6f 6e 74 65 78 74 20 6e 63 3b 20 20 20 20 2f  Context nc;    /
c2e0: 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
c2f0: 6f 72 20 72 65 73 6f 6c 76 69 6e 67 20 70 45 20  or resolving pE 
c300: 2a 2f 0a 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  */...  /* If the
c310: 20 74 65 72 6d 20 69 73 20 61 6e 20 69 6e 74 65   term is an inte
c320: 67 65 72 20 63 6f 6e 73 74 61 6e 74 2c 20 72 65  ger constant, re
c330: 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
c340: 66 20 74 68 61 74 0a 20 20 2a 2a 20 63 6f 6e 73  f that.  ** cons
c350: 74 61 6e 74 20 2a 2f 0a 20 20 70 45 4c 69 73 74  tant */.  pEList
c360: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
c370: 73 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  st;.  if( sqlite
c380: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
c390: 45 2c 20 26 69 29 20 29 7b 0a 20 20 20 20 69 66  E, &i) ){.    if
c3a0: 28 20 69 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i<=0 ){.      
c3b0: 2f 2a 20 49 66 20 69 20 69 73 20 74 6f 6f 20 73  /* If i is too s
c3c0: 6d 61 6c 6c 2c 20 6d 61 6b 65 20 69 74 20 74 6f  mall, make it to
c3d0: 6f 20 62 69 67 2e 20 20 54 68 61 74 20 77 61 79  o big.  That way
c3e0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 20 20 20   the calling.   
c3f0: 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73     ** function s
c400: 74 69 6c 6c 20 73 65 65 73 20 61 20 76 61 6c 75  till sees a valu
c410: 65 20 74 68 61 74 20 69 73 20 6f 75 74 20 6f 66  e that is out of
c420: 20 72 61 6e 67 65 2c 20 62 75 74 20 64 6f 65 73   range, but does
c430: 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f  .      ** not co
c440: 6e 66 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  nfuse the column
c450: 20 6e 75 6d 62 65 72 20 77 69 74 68 20 30 20 6f   number with 0 o
c460: 72 20 2d 31 20 72 65 73 75 6c 74 20 63 6f 64 65  r -1 result code
c470: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c480: 20 69 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78   i = pEList->nEx
c490: 70 72 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pr+1;.    }.    
c4a0: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 0a 20  return i;.  }.. 
c4b0: 20 2f 2a 20 49 66 20 74 68 65 20 74 65 72 6d 20   /* If the term 
c4c0: 69 73 20 61 20 73 69 6d 70 6c 65 20 69 64 65 6e  is a simple iden
c4d0: 74 69 66 69 65 72 20 74 68 61 74 20 74 72 79 20  tifier that try 
c4e0: 74 6f 20 6d 61 74 63 68 20 74 68 61 74 20 69 64  to match that id
c4f0: 65 6e 74 69 66 69 65 72 0a 20 20 2a 2a 20 61 67  entifier.  ** ag
c500: 61 69 6e 73 74 20 61 20 63 6f 6c 75 6d 6e 20 6e  ainst a column n
c510: 61 6d 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ame in the resul
c520: 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
c530: 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  ( pE->op==TK_ID 
c540: 7c 7c 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53  || (pE->op==TK_S
c550: 54 52 49 4e 47 20 26 26 20 70 45 2d 3e 74 6f 6b  TRING && pE->tok
c560: 65 6e 2e 7a 5b 30 5d 21 3d 27 5c 27 27 29 20 29  en.z[0]!='\'') )
c570: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
c580: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
c590: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d      char *zCol =
c5a0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
c5b0: 54 6f 6b 65 6e 28 64 62 2c 20 26 70 45 2d 3e 74  Token(db, &pE->t
c5c0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a  oken);.    if( z
c5d0: 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col==0 ){.      
c5e0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
c5f0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
c600: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
c610: 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ++){.      char 
c620: 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61  *zAs = pEList->a
c630: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
c640: 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73   if( zAs!=0 && s
c650: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
c660: 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  s, zCol)==0 ){. 
c670: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
c680: 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  ree(zCol);.     
c690: 20 20 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20     return i+1;. 
c6a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c6b0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
c6c0: 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ol);.  }..  /* R
c6d0: 65 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73  esolve all names
c6e0: 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
c6f0: 20 74 65 72 6d 20 65 78 70 72 65 73 73 69 6f 6e   term expression
c700: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
c710: 6e 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6e 63  nc, 0, sizeof(nc
c720: 29 29 3b 0a 20 20 6e 63 2e 70 50 61 72 73 65 20  ));.  nc.pParse 
c730: 3d 20 70 50 61 72 73 65 3b 0a 20 20 6e 63 2e 70  = pParse;.  nc.p
c740: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
c750: 74 2d 3e 70 53 72 63 3b 0a 20 20 6e 63 2e 70 45  t->pSrc;.  nc.pE
c760: 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20  List = pEList;. 
c770: 20 6e 63 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31   nc.allowAgg = 1
c780: 3b 0a 20 20 6e 63 2e 6e 45 72 72 20 3d 20 30 3b  ;.  nc.nErr = 0;
c790: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
c7a0: 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
c7b0: 6e 63 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 69  nc, pE) ){.    i
c7c0: 66 28 20 69 73 43 6f 6d 70 6f 75 6e 64 20 29 7b  f( isCompound ){
c7d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
c7e0: 72 6f 72 43 6c 65 61 72 28 70 50 61 72 73 65 29  rorClear(pParse)
c7f0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
c800: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c810: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
c820: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 63    }.  }.  if( nc
c830: 2e 68 61 73 41 67 67 20 26 26 20 70 48 61 73 41  .hasAgg && pHasA
c840: 67 67 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 41  gg ){.    *pHasA
c850: 67 67 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  gg = 1;.  }..  /
c860: 2a 20 46 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64  * For a compound
c870: 20 53 45 4c 45 43 54 2c 20 77 65 20 6e 65 65 64   SELECT, we need
c880: 20 74 6f 20 74 72 79 20 74 6f 20 6d 61 74 63 68   to try to match
c890: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
c8a0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67  ** expression ag
c8b0: 61 69 6e 73 74 20 61 6e 20 65 78 70 72 65 73 73  ainst an express
c8c0: 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ion in the resul
c8d0: 74 20 73 65 74 0a 20 20 2a 2f 0a 20 20 69 66 28  t set.  */.  if(
c8e0: 20 69 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20   isCompound ){. 
c8f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
c900: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
c910: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
c920: 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
c930: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
c940: 70 72 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20  pr, pE) ){.     
c950: 20 20 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20     return i+1;. 
c960: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c970: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
c980: 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61  ./*.** Analyze a
c990: 6e 64 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  nd ORDER BY or G
c9a0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69  ROUP BY clause i
c9b0: 6e 20 61 20 73 69 6d 70 6c 65 20 53 45 4c 45 43  n a simple SELEC
c9c0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
c9d0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
c9e0: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
c9f0: 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 74 65  ..**.** Every te
ca00: 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  rm of the ORDER 
ca10: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
ca20: 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 62  lause needs to b
ca30: 65 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  e an.** expressi
ca40: 6f 6e 2e 20 20 49 66 20 61 6e 79 20 65 78 70 72  on.  If any expr
ca50: 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74  ession is an int
ca60: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2c 20 74  eger constant, t
ca70: 68 65 6e 0a 2a 2a 20 74 68 61 74 20 65 78 70 72  hen.** that expr
ca80: 65 73 73 69 6f 6e 20 69 73 20 72 65 70 6c 61 63  ession is replac
ca90: 65 64 20 62 79 20 74 68 65 20 63 6f 72 72 65 73  ed by the corres
caa0: 70 6f 6e 64 69 6e 67 20 0a 2a 2a 20 65 78 70 72  ponding .** expr
cab0: 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  ession from the 
cac0: 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73  result set..*/.s
cad0: 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73  tatic int proces
cae0: 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 0a 20  sOrderGroupBy(. 
caf0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
cb00: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
cb10: 67 20 63 6f 6e 74 65 78 74 2e 20 20 4c 65 61 76  g context.  Leav
cb20: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  e error messages
cb30: 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63   here */.  Selec
cb40: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
cb50: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
cb60: 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e  tatement contain
cb70: 69 6e 67 20 74 68 65 20 63 6c 61 75 73 65 20 2a  ing the clause *
cb80: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
cb90: 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 54 68 65  rderBy,   /* The
cba0: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
cbb0: 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  UP BY clause to 
cbc0: 62 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  be processed */.
cbd0: 20 20 69 6e 74 20 69 73 4f 72 64 65 72 2c 20 20    int isOrder,  
cbe0: 20 20 20 20 20 20 20 20 2f 2a 20 31 20 66 6f 72          /* 1 for
cbf0: 20 4f 52 44 45 52 20 42 59 2e 20 20 30 20 66 6f   ORDER BY.  0 fo
cc00: 72 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  r GROUP BY */.  
cc10: 75 38 20 2a 70 48 61 73 41 67 67 20 20 20 20 20  u8 *pHasAgg     
cc20: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
cc30: 54 52 55 45 20 69 66 20 61 6e 79 20 74 65 72 6d  TRUE if any term
cc40: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 61 67 67   contains an agg
cc50: 72 65 67 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69  regate */.){.  i
cc60: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
cc70: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
cc80: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
cc90: 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 4f 72  List;..  if( pOr
cca0: 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 50 61 72  derBy==0 || pPar
ccb0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
ccc0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  iled ) return 0;
ccd0: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d  .  if( pOrderBy-
cce0: 3e 6e 45 78 70 72 3e 53 51 4c 49 54 45 5f 4d 41  >nExpr>SQLITE_MA
ccf0: 58 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  X_COLUMN ){.    
cd00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
cd10: 65 20 3d 20 69 73 4f 72 64 65 72 20 3f 20 22 4f  e = isOrder ? "O
cd20: 52 44 45 52 22 20 3a 20 22 47 52 4f 55 50 22 3b  RDER" : "GROUP";
cd30: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
cd40: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
cd50: 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20  o many terms in 
cd60: 25 73 20 42 59 20 63 6c 61 75 73 65 22 2c 20 7a  %s BY clause", z
cd70: 54 79 70 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Type);.    retur
cd80: 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 45 4c 69 73  n 1;.  }.  pELis
cd90: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
cda0: 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ist;.  if( pELis
cdb0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
cdc0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
cdd0: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
cde0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
cdf0: 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
ce00: 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65  Expr *pE = pOrde
ce10: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
ce20: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 6d 61 74 63  .    iCol = matc
ce30: 68 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78  hOrderByTermToEx
ce40: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
ce50: 53 65 6c 65 63 74 2c 20 70 45 2c 20 69 2b 31 2c  Select, pE, i+1,
ce60: 20 30 2c 20 70 48 61 73 41 67 67 29 3b 0a 20 20   0, pHasAgg);.  
ce70: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
ce80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
ce90: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
cea0: 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  ol>pEList->nExpr
ceb0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
cec0: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 69 73  char *zType = is
ced0: 4f 72 64 65 72 20 3f 20 22 4f 52 44 45 52 22 20  Order ? "ORDER" 
cee0: 3a 20 22 47 52 4f 55 50 22 3b 0a 20 20 20 20 20  : "GROUP";.     
cef0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
cf00: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
cf10: 20 20 20 22 25 72 20 25 73 20 42 59 20 74 65 72     "%r %s BY ter
cf20: 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d  m out of range -
cf30: 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20   should be ".   
cf40: 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31        "between 1
cf50: 20 61 6e 64 20 25 64 22 2c 20 69 2b 31 2c 20 7a   and %d", i+1, z
cf60: 54 79 70 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Type, pEList->nE
cf70: 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  xpr);.      retu
cf80: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
cf90: 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20  if( iCol>0 ){.  
cfa0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
cfb0: 6c 6c 20 3d 20 70 45 2d 3e 70 43 6f 6c 6c 3b 0a  ll = pE->pColl;.
cfc0: 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
cfd0: 3d 20 70 45 2d 3e 66 6c 61 67 73 20 26 20 45 50  = pE->flags & EP
cfe0: 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  _ExpCollate;.   
cff0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
d000: 6c 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20  lete(pE);.      
d010: 70 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pE = sqlite3Expr
d020: 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e  Dup(db, pEList->
d030: 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29  a[iCol-1].pExpr)
d040: 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ;.      pOrderBy
d050: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70  ->a[i].pExpr = p
d060: 45 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 20  E;.      if( pE 
d070: 26 26 20 70 43 6f 6c 6c 20 26 26 20 66 6c 61 67  && pColl && flag
d080: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 2d  s ){.        pE-
d090: 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  >pColl = pColl;.
d0a0: 20 20 20 20 20 20 20 20 70 45 2d 3e 66 6c 61 67          pE->flag
d0b0: 73 20 7c 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20  s |= flags;.    
d0c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
d0d0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
d0e0: 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20 4f  ** Analyze and O
d0f0: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
d100: 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20   BY clause in a 
d110: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d120: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
d130: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
d140: 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  s seen..**.** Th
d150: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 64 65 70  e processing dep
d160: 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20  ends on whether 
d170: 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 73 69  the SELECT is si
d180: 6d 70 6c 65 20 6f 72 20 63 6f 6d 70 6f 75 6e 64  mple or compound
d190: 2e 0a 2a 2a 20 46 6f 72 20 61 20 73 69 6d 70 6c  ..** For a simpl
d1a0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
d1b0: 6e 74 2c 20 65 76 72 79 20 74 65 72 6d 20 6f 66  nt, evry term of
d1c0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72   the ORDER BY or
d1d0: 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 63 6c 61   GROUP BY.** cla
d1e0: 75 73 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  use needs to be 
d1f0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  an expression.  
d200: 49 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  If any expressio
d210: 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 0a  n is an integer.
d220: 2a 2a 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65  ** constant, the
d230: 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  n that expressio
d240: 6e 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79  n is replaced by
d250: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
d260: 6e 67 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ng .** expressio
d270: 6e 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c  n from the resul
d280: 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  t set..**.** For
d290: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
d2a0: 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 65 76 65   statements, eve
d2b0: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 65  ry expression ne
d2c0: 65 64 73 20 74 6f 20 62 65 20 6f 66 0a 2a 2a 20  eds to be of.** 
d2d0: 74 79 70 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 77  type TK_COLUMN w
d2e0: 69 74 68 20 61 20 69 54 61 62 6c 65 20 76 61 6c  ith a iTable val
d2f0: 75 65 20 61 73 20 67 69 76 65 6e 20 69 6e 20 74  ue as given in t
d300: 68 65 20 34 74 68 20 70 61 72 61 6d 65 74 65 72  he 4th parameter
d310: 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 65 78 70 72  ..** If any expr
d320: 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74  ession is an int
d330: 65 67 65 72 2c 20 74 68 61 74 20 62 65 63 6f 6d  eger, that becom
d340: 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  es the column nu
d350: 6d 62 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  mber..** Otherwi
d360: 73 65 2c 20 6d 61 74 63 68 20 74 68 65 20 65 78  se, match the ex
d370: 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 73 74  pression against
d380: 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75   result set colu
d390: 6d 6e 73 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  mns from.** the 
d3a0: 6c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  left-most SELECT
d3b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d3c0: 70 72 6f 63 65 73 73 43 6f 6d 70 6f 75 6e 64 4f  processCompoundO
d3d0: 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
d3e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d3f0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
d400: 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72 6f 72  xt.  Leave error
d410: 20 6d 65 73 73 61 67 65 73 20 68 65 72 65 20 2a   messages here *
d420: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
d430: 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ect,      /* The
d440: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
d450: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
d460: 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 69   ORDER BY */.  i
d470: 6e 74 20 69 54 61 62 6c 65 20 20 20 20 20 20 20  nt iTable       
d480: 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74       /* Output t
d490: 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 6f 75 6e  able for compoun
d4a0: 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
d4b0: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
d4c0: 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  i;.  ExprList *p
d4d0: 4f 72 64 65 72 42 79 3b 0a 20 20 45 78 70 72 4c  OrderBy;.  ExprL
d4e0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
d4f0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
d500: 74 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a  t moreToDo = 1;.
d510: 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 53  .  pOrderBy = pS
d520: 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 3b  elect->pOrderBy;
d530: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d  .  if( pOrderBy=
d540: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
d550: 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e   if( pOrderBy->n
d560: 45 78 70 72 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Expr>SQLITE_MAX_
d570: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 73 71  COLUMN ){.    sq
d580: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d590: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
d5a0: 74 65 72 6d 73 20 69 6e 20 4f 52 44 45 52 20 42  terms in ORDER B
d5b0: 59 20 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20  Y clause");.    
d5c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
d5d0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d5e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
d5f0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
d600: 2b 2b 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42  ++){.    pOrderB
d610: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30  y->a[i].done = 0
d620: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
d630: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
d640: 7b 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20  {.    pSelect = 
d650: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b  pSelect->pPrior;
d660: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53  .  }.  while( pS
d670: 65 6c 65 63 74 20 26 26 20 6d 6f 72 65 54 6f 44  elect && moreToD
d680: 6f 20 29 7b 0a 20 20 20 20 6d 6f 72 65 54 6f 44  o ){.    moreToD
d690: 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  o = 0;.    for(i
d6a0: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
d6b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
d6c0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31     int iCol = -1
d6d0: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  ;.      Expr *pE
d6e0: 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69  , *pDup;.      i
d6f0: 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  f( pOrderBy->a[i
d700: 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75  ].done ) continu
d710: 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70 4f  e;.      pE = pO
d720: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
d730: 70 72 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d  pr;.      pDup =
d740: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
d750: 64 62 2c 20 70 45 29 3b 0a 20 20 20 20 20 20 69  db, pE);.      i
d760: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
d770: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
d780: 61 73 73 65 72 74 28 70 44 75 70 29 3b 0a 20 20  assert(pDup);.  
d790: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6d 61 74        iCol = mat
d7a0: 63 68 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45  chOrderByTermToE
d7b0: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
d7c0: 70 53 65 6c 65 63 74 2c 20 70 44 75 70 2c 20 69  pSelect, pDup, i
d7d0: 2b 31 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  +1, 1, 0);.     
d7e0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
d7f0: 45 78 70 72 44 65 6c 65 74 65 28 70 44 75 70 29  ExprDelete(pDup)
d800: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
d810: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  <0 ){.        re
d820: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
d830: 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
d840: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
d850: 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74        if( pEList
d860: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
d870: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
d880: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  .      if( iCol>
d890: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
d8a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d8b0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
d8c0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 25 72   .           "%r
d8d0: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f   ORDER BY term o
d8e0: 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68  ut of range - sh
d8f0: 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20  ould be ".      
d900: 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20       "between 1 
d910: 61 6e 64 20 25 64 22 2c 20 69 2b 31 2c 20 70 45  and %d", i+1, pE
d920: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
d930: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
d940: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d950: 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20  ( iCol>0 ){.    
d960: 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f      pE->op = TK_
d970: 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
d980: 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61  pE->iTable = iTa
d990: 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 45 2d  ble;.        pE-
d9a0: 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20  >iAgg = -1;.    
d9b0: 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20      pE->iColumn 
d9c0: 3d 20 69 43 6f 6c 2d 31 3b 0a 20 20 20 20 20 20  = iCol-1;.      
d9d0: 20 20 70 45 2d 3e 70 54 61 62 20 3d 20 30 3b 0a    pE->pTab = 0;.
d9e0: 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
d9f0: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b  ->a[i].done = 1;
da00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
da10: 20 20 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d        moreToDo =
da20: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
da30: 7d 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20  }.    pSelect = 
da40: 70 53 65 6c 65 63 74 2d 3e 70 4e 65 78 74 3b 0a  pSelect->pNext;.
da50: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
da60: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
da70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
da80: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
da90: 6f 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  one==0 ){.      
daa0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
dab0: 70 50 61 72 73 65 2c 20 22 25 72 20 4f 52 44 45  pParse, "%r ORDE
dac0: 52 20 42 59 20 74 65 72 6d 20 64 6f 65 73 20 6e  R BY term does n
dad0: 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 22 0a 20  ot match any ". 
dae0: 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c 75             "colu
daf0: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
db00: 20 73 65 74 22 2c 20 69 2b 31 29 3b 0a 20 20 20   set", i+1);.   
db10: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
db20: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
db30: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  0;.}../*.** Get 
db40: 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67  a VDBE for the g
db50: 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74  iven parser cont
db60: 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ext.  Create a n
db70: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
db80: 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ary..** If an er
db90: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
dba0: 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76  rn NULL and leav
dbb0: 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70  e a message in p
dbc0: 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a  Parse..*/.Vdbe *
dbd0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50  sqlite3GetVdbe(P
dbe0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
dbf0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
dc00: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
dc10: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20  v==0 ){.    v = 
dc20: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
dc30: 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74  sqlite3VdbeCreat
dc40: 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 23  e(pParse->db);.#
dc50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
dc60: 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28  IT_TRACE.    if(
dc70: 20 76 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69   v ){.      sqli
dc80: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
dc90: 20 4f 50 5f 54 72 61 63 65 29 3b 0a 20 20 20 20   OP_Trace);.    
dca0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  }.#endif.  }.  r
dcb0: 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn v;.}.../*.
dcc0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69  ** Compute the i
dcd0: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
dce0: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
dcf0: 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20  SELECT based on 
dd00: 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e  the.** pLimit an
dd10: 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65 73  d pOffset expres
dd20: 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61  sions.  pLimit a
dd30: 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20  nd pOffset hold 
dd40: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  the expressions.
dd50: 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ** that appear i
dd60: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
dd70: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74  QL statement aft
dd80: 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  er the LIMIT and
dd90: 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f   OFFSET.** keywo
dda0: 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66  rds.  Or NULL if
ddb0: 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   those keywords 
ddc0: 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69  are omitted. iLi
ddd0: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
dde0: 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65  .** are the inte
ddf0: 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  ger memory regis
de00: 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  ter numbers for 
de10: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f  counters used to
de20: 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65   compute .** the
de30: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
de40: 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  t.  If there is 
de50: 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20  no limit and/or 
de60: 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a  offset, then .**
de70: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
de80: 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65  set are negative
de90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
dea0: 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65  tine changes the
deb0: 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69   values of iLimi
dec0: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e  t and iOffset on
ded0: 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74  ly if.** a limit
dee0: 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65   or offset is de
def0: 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20  fined by pLimit 
df00: 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c  and pOffset.  iL
df10: 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66  imit and.** iOff
df20: 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20  set should have 
df30: 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61  been preset to a
df40: 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75  ppropriate defau
df50: 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73  lt values.** (us
df60: 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c  ually but not al
df70: 77 61 79 73 20 2d 31 29 20 70 72 69 6f 72 20 74  ways -1) prior t
df80: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
df90: 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20  outine..** Only 
dfa0: 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20  if pLimit!=0 or 
dfb0: 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68  pOffset!=0 do th
dfc0: 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
dfd0: 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e  s get.** redefin
dfe0: 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41  ed.  The UNION A
dff0: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73  LL operator uses
e000: 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74   this property t
e010: 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72  o force.** the r
e020: 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65  euse of the same
e030: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
e040: 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f  t registers acro
e050: 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53  ss multiple.** S
e060: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
e070: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e080: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
e090: 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50  isters(Parse *pP
e0a0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
e0b0: 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20   int iBreak){.  
e0c0: 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69  Vdbe *v = 0;.  i
e0d0: 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  nt iLimit = 0;. 
e0e0: 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20   int iOffset;.  
e0f0: 69 6e 74 20 61 64 64 72 31 3b 0a 0a 20 20 2f 2a  int addr1;..  /*
e100: 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31   .  ** "LIMIT -1
e110: 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61  " always shows a
e120: 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20  ll rows.  There 
e130: 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e  is some.  ** con
e140: 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20 77  traversy about w
e150: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
e160: 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20  behavior should 
e170: 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72  be..  ** The cur
e180: 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
e190: 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22  ion interprets "
e1a0: 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e  LIMIT 0" to mean
e1b0: 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20  .  ** no rows.. 
e1c0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   */.  if( p->pLi
e1d0: 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c  mit ){.    p->iL
e1e0: 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20  imit = iLimit = 
e1f0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
e200: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
e210: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
e220: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
e230: 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
e240: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
e250: 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c  e, p->pLimit, iL
e260: 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  imit);.    sqlit
e270: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
e280: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c  OP_MustBeInt, iL
e290: 69 6d 69 74 29 3b 0a 20 20 20 20 56 64 62 65 43  imit);.    VdbeC
e2a0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
e2b0: 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
e2c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e2d0: 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op2(v, OP_IfZero
e2e0: 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  , iLimit, iBreak
e2f0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
e300: 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 70  pOffset ){.    p
e310: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  ->iOffset = iOff
e320: 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
e330: 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d  nMem;.    if( p-
e340: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >pLimit ){.     
e350: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
e360: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
e370: 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  n extra register
e380: 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65   for limit+offse
e390: 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 76  t */.    }.    v
e3a0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
e3b0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
e3c0: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
e3d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
e3e0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d  rCode(pParse, p-
e3f0: 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65  >pOffset, iOffse
e400: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
e410: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
e420: 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73  MustBeInt, iOffs
e430: 65 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  et);.    VdbeCom
e440: 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54  ment((v, "OFFSET
e450: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
e460: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
e470: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
e480: 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 29  _IfPos, iOffset)
e490: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e4a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
e4b0: 74 65 67 65 72 2c 20 30 2c 20 69 4f 66 66 73 65  teger, 0, iOffse
e4c0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
e4d0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
e4e0: 64 64 72 31 29 3b 0a 20 20 20 20 69 66 28 20 70  ddr1);.    if( p
e4f0: 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
e500: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e510: 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69  Op3(v, OP_Add, i
e520: 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c 20  Limit, iOffset, 
e530: 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20  iOffset+1);.    
e540: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
e550: 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22  , "LIMIT+OFFSET"
e560: 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20  ));.      addr1 
e570: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
e580: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
e590: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
e5a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e5b0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
e5c0: 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b   -1, iOffset+1);
e5d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e5e0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
e5f0: 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  dr1);.    }.  }.
e600: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
e610: 65 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  e a virtual inde
e620: 78 20 74 6f 20 75 73 65 20 66 6f 72 20 73 6f 72  x to use for sor
e630: 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ting..*/.static 
e640: 76 6f 69 64 20 63 72 65 61 74 65 53 6f 72 74 69  void createSorti
e650: 6e 67 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  ngIndex(Parse *p
e660: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
e670: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64  , ExprList *pOrd
e680: 65 72 42 79 29 7b 0a 20 20 69 66 28 20 70 4f 72  erBy){.  if( pOr
e690: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74  derBy ){.    int
e6a0: 20 61 64 64 72 3b 0a 20 20 20 20 61 73 73 65 72   addr;.    asser
e6b0: 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  t( pOrderBy->iEC
e6c0: 75 72 73 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20  ursor==0 );.    
e6d0: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
e6e0: 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
e6f0: 62 2b 2b 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  b++;.    addr = 
e700: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e710: 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
e720: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
e730: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
e750: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
e760: 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  r, pOrderBy->nEx
e770: 70 72 2b 31 29 3b 0a 20 20 20 20 61 73 73 65 72  pr+1);.    asser
e780: 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
e790: 68 6d 5b 32 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[2] == -1 );. 
e7a0: 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
e7b0: 68 6d 5b 32 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[2] = addr;.  
e7c0: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
e7d0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
e7e0: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52  D_SELECT./*.** R
e7f0: 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70  eturn the approp
e800: 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  riate collating 
e810: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
e820: 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
e830: 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  of.** the result
e840: 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d   set for the com
e850: 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61  pound-select sta
e860: 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74  tement "p".  Ret
e870: 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74  urn NULL if.** t
e880: 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f  he column has no
e890: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
e8a0: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
e8b0: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
e8c0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
e8d0: 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
e8e0: 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  t is taken from 
e8f0: 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  the.** left-most
e900: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c   term of the sel
e910: 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63  ect that has a c
e920: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
e930: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c  e..*/.static Col
e940: 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63  lSeq *multiSelec
e950: 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  tCollSeq(Parse *
e960: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
e970: 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  p, int iCol){.  
e980: 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20  CollSeq *pRet;. 
e990: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
e9a0: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c  {.    pRet = mul
e9b0: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
e9c0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f  pParse, p->pPrio
e9d0: 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73  r, iCol);.  }els
e9e0: 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b  e{.    pRet = 0;
e9f0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 65 74 3d  .  }.  if( pRet=
ea00: 3d 30 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  =0 ){.    pRet =
ea10: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
ea20: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
ea30: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
ea40: 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Expr);.  }.  ret
ea50: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn pRet;.}.#end
ea60: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
ea70: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
ea80: 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  T */..#ifndef SQ
ea90: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
eaa0: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
eab0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
eac0: 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
ead0: 73 20 61 20 71 75 65 72 79 20 74 68 61 74 20 69  s a query that i
eae0: 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75 6e 69  s really the uni
eaf0: 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65  on.** or interse
eb00: 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20  ction of two or 
eb10: 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75  more separate qu
eb20: 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22  eries..**.** "p"
eb30: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72   points to the r
eb40: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65  ight-most of the
eb50: 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74   two queries.  t
eb60: 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a  he query on the.
eb70: 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50  ** left is p->pP
eb80: 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20  rior.  The left 
eb90: 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f  query could also
eba0: 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   be a compound q
ebb0: 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68  uery.** in which
ebc0: 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
ebd0: 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
ebe0: 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a  d recursively. .
ebf0: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
ec00: 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71  s of the total q
ec10: 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77  uery are to be w
ec20: 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65  ritten into a de
ec30: 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  stination.** of 
ec40: 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20  type eDest with 
ec50: 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e  parameter iParm.
ec60: 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
ec70: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68  :  Consider a th
ec80: 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64  ree-way compound
ec90: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
eca0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
ecb0: 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   a FROM t1 UNION
ecc0: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
ecd0: 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63  2 UNION SELECT c
ece0: 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54   FROM t3.**.** T
ecf0: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
ed00: 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f   parsed up as fo
ed10: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
ed20: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
ed30: 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20  3.**      |.**  
ed40: 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c      `----->  SEL
ed50: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a  ECT b FROM t2.**
ed60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed70: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
ed80: 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45      `------>  SE
ed90: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a  LECT a FROM t1.*
eda0: 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20  *.** The arrows 
edb0: 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61  in the diagram a
edc0: 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74  bove represent t
edd0: 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72  he Select.pPrior
ede0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20   pointer..** So 
edf0: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
ee00: 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  is called with p
ee10: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33   equal to the t3
ee20: 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20   query, then.** 
ee30: 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74  pPrior will be t
ee40: 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d  he t2 query.  p-
ee50: 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55  >op will be TK_U
ee60: 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73  NION in this cas
ee70: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20  e..**.** Notice 
ee80: 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20  that because of 
ee90: 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70  the way SQLite p
eea0: 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53  arses compound S
eeb0: 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69  ELECTs, the.** i
eec0: 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
eed0: 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66  s always group f
eee0: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
eef0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
ef00: 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20   multiSelect(.  
ef10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
ef20: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
ef30: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
ef40: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
ef50: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
ef60: 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
ef70: 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
ef80: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
ef90: 65 73 74 2c 20 20 20 20 2f 2a 20 57 68 61 74 20  est,    /* What 
efa0: 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
efb0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 63 68   results */.  ch
efc0: 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20  ar *aff         
efd0: 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20      /* If eDest 
efe0: 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68  is SRT_Union, th
eff0: 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
f000: 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  g */.){.  int rc
f010: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
f020: 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
f030: 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
f040: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
f050: 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
f060: 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
f070: 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
f080: 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
f090: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
f0a0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
f0b0: 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
f0c0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  */.  int nCol;  
f0d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
f0e0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
f0f0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
f100: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
f110: 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20  *pOrderBy;   /* 
f120: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
f130: 75 73 65 20 6f 6e 20 70 20 2a 2f 0a 20 20 69 6e  use on p */.  in
f140: 74 20 61 53 65 74 50 32 5b 32 5d 3b 20 20 20 20  t aSetP2[2];    
f150: 20 20 20 20 2f 2a 20 53 65 74 20 50 32 20 76 61      /* Set P2 va
f160: 6c 75 65 20 6f 66 20 74 68 65 73 65 20 6f 70 20  lue of these op 
f170: 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  to number of col
f180: 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  umns */.  int nS
f190: 65 74 50 32 20 3d 20 30 3b 20 20 20 20 20 20 20  etP2 = 0;       
f1a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f  /* Number of slo
f1b0: 74 73 20 69 6e 20 61 53 65 74 50 32 5b 5d 20 75  ts in aSetP2[] u
f1c0: 73 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  sed */.  SelectD
f1d0: 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f  est dest;      /
f1e0: 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61  * Alternative da
f1f0: 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a  ta destination *
f200: 2f 0a 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65  /..  dest = *pDe
f210: 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  st;..  /* Make s
f220: 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ure there is no 
f230: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
f240: 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f  T clause on prio
f250: 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79  r SELECTs.  Only
f260: 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28  .  ** the last (
f270: 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45  right-most) SELE
f280: 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73  CT in the series
f290: 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44   may have an ORD
f2a0: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a  ER BY or LIMIT..
f2b0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20    */.  if( p==0 
f2c0: 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  || p->pPrior==0 
f2d0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  ){.    rc = 1;. 
f2e0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
f2f0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
f300: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
f310: 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
f320: 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74  rior->pRightmost
f330: 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73  !=pPrior );.  as
f340: 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52  sert( pPrior->pR
f350: 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69  ightmost==p->pRi
f360: 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 69 66 28  ghtmost );.  if(
f370: 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
f380: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
f390: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f3a0: 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
f3b0: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
f3c0: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
f3d0: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
f3e0: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
f3f0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
f400: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
f410: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
f420: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
f430: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
f440: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49  orMsg(pParse,"LI
f450: 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  MIT clause shoul
f460: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
f470: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
f480: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
f490: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
f4a0: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
f4b0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
f4c0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
f4d0: 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61  ure we have a va
f4e0: 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65  lid query engine
f4f0: 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74  .  If not, creat
f500: 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a  e a new one..  *
f510: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
f520: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
f530: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
f540: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
f550: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
f560: 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  end;.  }..  /* C
f570: 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e  reate the destin
f580: 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20  ation temporary 
f590: 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61  table if necessa
f5a0: 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  ry.  */.  if( de
f5b0: 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  st.eDest==SRT_Ep
f5c0: 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73  hemTab ){.    as
f5d0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
f5e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
f5f0: 53 65 74 50 32 3c 73 69 7a 65 6f 66 28 61 53 65  SetP2<sizeof(aSe
f600: 74 50 32 29 2f 73 69 7a 65 6f 66 28 61 53 65 74  tP2)/sizeof(aSet
f610: 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20 61 53  P2[0]) );.    aS
f620: 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d  etP2[nSetP2++] =
f630: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f640: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
f650: 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 50 61  emeral, dest.iPa
f660: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 64 65 73 74  rm, 0);.    dest
f670: 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62  .eDest = SRT_Tab
f680: 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  le;.  }..  /* Ge
f690: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
f6a0: 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
f6b0: 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ht SELECT statem
f6c0: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72  ents..  */.  pOr
f6d0: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
f6e0: 72 42 79 3b 0a 20 20 73 77 69 74 63 68 28 20 70  rBy;.  switch( p
f6f0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
f700: 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20   TK_ALL: {.     
f710: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
f720: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
f730: 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
f740: 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
f750: 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20  r->pLimit );.   
f760: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69       pPrior->pLi
f770: 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
f780: 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d  .        pPrior-
f790: 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  >pOffset = p->pO
f7a0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 72  ffset;.        r
f7b0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
f7c0: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
f7d0: 2c 20 26 64 65 73 74 2c 20 30 2c 20 30 2c 20 30  , &dest, 0, 0, 0
f7e0: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  , aff);.        
f7f0: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
f800: 20 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65         p->pOffse
f810: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  t = 0;.        i
f820: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
f830: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
f840: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
f850: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70    }.        p->p
f860: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
f870: 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70     p->iLimit = p
f880: 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20  Prior->iLimit;. 
f890: 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65         p->iOffse
f8a0: 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66  t = pPrior->iOff
f8b0: 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  set;.        if(
f8c0: 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b   p->iLimit>=0 ){
f8d0: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20  .          addr 
f8e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f8f0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op1(v, OP_IfZero
f900: 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20  , p->iLimit);.  
f910: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
f920: 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68  ent((v, "Jump ah
f930: 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61  ead if LIMIT rea
f940: 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20  ched"));.       
f950: 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
f960: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
f970: 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 2c 20  arse, p, &dest, 
f980: 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
f990: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
f9a0: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
f9b0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
f9c0: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
f9d0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
f9e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f9f0: 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20  if( addr ){.    
fa00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fa10: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
fa20: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
fa30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fa40: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f     }.      /* Fo
fa50: 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20  r UNION ALL ... 
fa60: 4f 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74 68  ORDER BY fall th
fa70: 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
fa80: 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  t case */.    }.
fa90: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
faa0: 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  PT:.    case TK_
fab0: 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  UNION: {.      i
fac0: 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20  nt unionTab;    
fad0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
fae0: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
faf0: 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20  y table holding 
fb00: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
fb10: 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20 20 20 20  int op = 0;     
fb20: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53   /* One of the S
fb30: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  RT_ operations t
fb40: 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20  o apply to self 
fb50: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69  */.      int pri
fb60: 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  orOp;     /* The
fb70: 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20   SRT_ operation 
fb80: 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f  to apply to prio
fb90: 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20  r selects */.   
fba0: 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c     Expr *pLimit,
fbb0: 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61   *pOffset; /* Sa
fbc0: 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d  ved values of p-
fbd0: 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e  >nLimit and p->n
fbe0: 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  Offset */.      
fbf0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
fc00: 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e  SelectDest union
fc10: 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 70 72 69  dest;..      pri
fc20: 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b  orOp = p->op==TK
fc30: 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65  _ALL ? SRT_Table
fc40: 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   : SRT_Union;.  
fc50: 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
fc60: 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70  st==priorOp && p
fc70: 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21 70  OrderBy==0 && !p
fc80: 2d 3e 70 4c 69 6d 69 74 20 26 26 20 21 70 2d 3e  ->pLimit && !p->
fc90: 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  pOffset ){.     
fca0: 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
fcb0: 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
fcc0: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
fcd0: 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
fce0: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
fcf0: 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
fd00: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
fd10: 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20  = dest.iParm;.  
fd20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fd30: 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65     /* We will ne
fd40: 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72  ed to create our
fd50: 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74   own temporary t
fd60: 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  able to hold the
fd70: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  .        ** inte
fd80: 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
fd90: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
fda0: 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
fdb0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
fdc0: 20 20 20 20 20 20 20 20 69 66 28 20 70 72 6f 63          if( proc
fdd0: 65 73 73 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72  essCompoundOrder
fde0: 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 75 6e  By(pParse, p, un
fdf0: 69 6f 6e 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ionTab) ){.     
fe00: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
fe10: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
fe20: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
fe30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fe40: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
fe50: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
fe60: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e  penEphemeral, un
fe70: 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
fe80: 20 20 20 20 69 66 28 20 70 72 69 6f 72 4f 70 3d      if( priorOp=
fe90: 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20  =SRT_Table ){.  
fea0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
feb0: 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28 61 53  nSetP2<sizeof(aS
fec0: 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61 53 65  etP2)/sizeof(aSe
fed0: 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20  tP2[0]) );.     
fee0: 20 20 20 20 20 61 53 65 74 50 32 5b 6e 53 65 74       aSetP2[nSet
fef0: 50 32 2b 2b 5d 20 3d 20 61 64 64 72 3b 0a 20 20  P2++] = addr;.  
ff00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ff10: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
ff20: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
ff30: 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
ff40: 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
ff50: 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
ff60: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69            p->pRi
ff70: 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70 68  ghtmost->usesEph
ff80: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  m = 1;.        }
ff90: 0a 20 20 20 20 20 20 20 20 63 72 65 61 74 65 53  .        createS
ffa0: 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72  ortingIndex(pPar
ffb0: 73 65 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 29  se, p, pOrderBy)
ffc0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
ffd0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
ffe0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
fff0: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
10000 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
10010 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f  ur left.      */
10020 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
10030 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
10040 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
10050 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
10060 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f  &uniondest, prio
10070 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a  rOp, unionTab);.
10080 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10090 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
100a0 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64   pPrior, &uniond
100b0 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  est, 0, 0, 0, af
100c0 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  f);.      if( rc
100d0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
100e0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
100f0 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
10100 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
10110 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  rrent SELECT sta
10120 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a  tement.      */.
10130 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70 2d        switch( p-
10140 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >op ){.         
10150 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
10160 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74   op = SRT_Except
10170 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
10180 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
10190 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e  N:   op = SRT_Un
101a0 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  ion;    break;. 
101b0 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
101c0 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52  ALL:     op = SR
101d0 54 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61  T_Table;    brea
101e0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
101f0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
10200 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
10210 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  y = 0;.      p->
10220 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20  disallowOrderBy 
10230 3d 20 70 4f 72 64 65 72 42 79 21 3d 30 3b 0a 20  = pOrderBy!=0;. 
10240 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
10250 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
10260 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
10270 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
10280 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
10290 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
102a0 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e        uniondest.
102b0 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20  eDest = op;.    
102c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
102d0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
102e0 26 75 6e 69 6f 6e 64 65 73 74 2c 20 30 2c 20 30  &uniondest, 0, 0
102f0 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
10300 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65   /* Query flatte
10310 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53  ning in sqlite3S
10320 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65  elect() might re
10330 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79  fill p->pOrderBy
10340 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75  ..      ** Be su
10350 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e  re to delete p->
10360 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66  pOrderBy, theref
10370 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20  ore, to avoid a 
10380 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a  memory leak. */.
10390 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
103a0 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70  rListDelete(p->p
103b0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
103c0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
103d0 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  or;.      p->pOr
103e0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
103f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
10400 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69  xprDelete(p->pLi
10410 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
10420 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
10430 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
10440 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
10450 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31    p->iLimit = -1
10460 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
10470 65 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69  et = -1;.      i
10480 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
10490 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
104a0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
104b0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  ..      /* Conve
104c0 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
104d0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
104e0 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
104f0 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69   form.      ** i
10500 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
10510 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
10520 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20     */      .    
10530 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
10540 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69  !=priorOp || uni
10550 6f 6e 54 61 62 21 3d 64 65 73 74 2e 69 50 61 72  onTab!=dest.iPar
10560 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  m ){.        int
10570 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
10580 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20  iStart;.        
10590 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
105a0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t );.        if(
105b0 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
105c0 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
105d0 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
105e0 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  First = p;.     
105f0 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
10600 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
10610 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
10620 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rior;.          
10630 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
10640 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
10650 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
10660 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10670 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
10680 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
10690 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e  v);.        iCon
106a0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
106b0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
106c0 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
106d0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
106e0 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
106f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10700 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
10710 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
10720 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
10730 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
10740 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
10750 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65  r(v);.        se
10760 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
10770 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
10780 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d  st, unionTab, p-
10790 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a  >pEList->nExpr,.
107a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107b0 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
107c0 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69 43 6f  , -1, &dest, iCo
107d0 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a  nt, iBreak, 0);.
107e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
107f0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
10800 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
10810 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10820 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
10830 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
10840 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
10850 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
10860 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
10870 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10880 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10890 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
108a0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
108b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
108c0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
108d0 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69  RSECT: {.      i
108e0 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20  nt tab1, tab2;. 
108f0 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
10900 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
10910 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
10920 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20  it, *pOffset;.  
10930 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
10940 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 69      SelectDest i
10950 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20  ntersectdest;.  
10960 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20      int r1;..   
10970 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20     /* INTERSECT 
10980 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
10990 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e  m the others sin
109a0 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20  ce it requires. 
109b0 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70       ** two temp
109c0 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48  orary tables.  H
109d0 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20  ence it has its 
109e0 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e  own case.  Begin
109f0 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c  .      ** by all
10a00 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c  ocating the tabl
10a10 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e  es we will need.
10a20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10a30 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
10a40 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62  Tab++;.      tab
10a50 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  2 = pParse->nTab
10a60 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 72  ++;.      if( pr
10a70 6f 63 65 73 73 43 6f 6d 70 6f 75 6e 64 4f 72 64  ocessCompoundOrd
10a80 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  erBy(pParse, p, 
10a90 74 61 62 31 29 20 29 7b 0a 20 20 20 20 20 20 20  tab1) ){.       
10aa0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
10ab0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
10ac0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
10ad0 20 20 20 20 20 20 63 72 65 61 74 65 53 6f 72 74        createSort
10ae0 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ingIndex(pParse,
10af0 20 70 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 0a   p, pOrderBy);..
10b00 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
10b10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10b20 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
10b30 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
10b40 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
10b50 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
10b60 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
10b70 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
10b80 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70   = addr;.      p
10b90 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73  ->pRightmost->us
10ba0 65 73 45 70 68 6d 20 3d 20 31 3b 0a 20 20 20 20  esEphm = 1;.    
10bb0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
10bc0 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
10bd0 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
10be0 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
10bf0 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
10c00 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
10c10 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
10c20 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
10c30 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
10c40 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
10c50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
10c60 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
10c70 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65  e, pPrior, &inte
10c80 72 73 65 63 74 64 65 73 74 2c 20 30 2c 20 30 2c  rsectdest, 0, 0,
10c90 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
10ca0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
10cb0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
10cc0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
10cd0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
10ce0 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
10cf0 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  CT into temporar
10d00 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20  y table "tab2". 
10d10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
10d20 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
10d30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
10d40 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32  nEphemeral, tab2
10d50 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
10d60 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
10d70 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[1] == -1 );.
10d80 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
10d90 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b  nEphm[1] = addr;
10da0 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
10db0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
10dc0 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
10dd0 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
10de0 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
10df0 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
10e00 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
10e10 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
10e20 65 72 73 65 63 74 64 65 73 74 2e 69 50 61 72 6d  ersectdest.iParm
10e30 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 72   = tab2;.      r
10e40 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
10e50 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e  t(pParse, p, &in
10e60 74 65 72 73 65 63 74 64 65 73 74 2c 20 30 2c 20  tersectdest, 0, 
10e70 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20  0, 0, aff);.    
10e80 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
10e90 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rior;.      sqli
10ea0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
10eb0 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
10ec0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
10ed0 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
10ee0 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
10ef0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
10f00 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
10f10 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
10f20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
10f30 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
10f40 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72  o take the inter
10f50 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  section of the t
10f60 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  wo temporary.   
10f70 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20     ** tables..  
10f80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
10f90 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
10fa0 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
10fb0 2e 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c  .eDest==SRT_Call
10fc0 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
10fd0 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
10fe0 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   p;.        whil
10ff0 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
11000 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
11010 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
11020 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
11030 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
11040 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
11050 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
11060 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
11070 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
11080 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74  (v);.      iCont
11090 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
110a0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
110b0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
110c0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
110d0 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
110e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
110f0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
11100 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b  , tab1, iBreak);
11110 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
11120 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
11130 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74  arse);.      iSt
11140 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
11150 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
11160 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b  wKey, tab1, r1);
11170 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11180 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
11190 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69  otFound, tab2, i
111a0 43 6f 6e 74 2c 20 72 31 29 3b 0a 20 20 20 20 20  Cont, r1);.     
111b0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
111c0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
111d0 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74  1);.      select
111e0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
111f0 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
11200 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  tab1, p->pEList-
11210 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
11230 72 64 65 72 42 79 2c 20 2d 31 2c 20 26 64 65 73  rderBy, -1, &des
11240 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
11250 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
11260 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
11270 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
11280 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11290 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
112a0 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29  t, tab1, iStart)
112b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
112c0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
112d0 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
112e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
112f0 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
11300 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
11310 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11320 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
11330 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
11340 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
11350 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
11360 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20   all SELECTs in 
11370 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
11380 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
11390 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20  er of elements. 
113a0 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73   ** in their res
113b0 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20  ult sets..  */. 
113c0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
113d0 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
113e0 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d  List );.  if( p-
113f0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
11400 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
11410 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
11420 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11430 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f  rse, "SELECTs to
11440 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
11450 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20  ght of %s".     
11460 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
11470 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
11480 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
11490 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
114a0 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
114b0 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
114c0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
114d0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
114e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
114f0 6d 6e 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  mns in temporary
11500 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20 6e   tables.  */.  n
11510 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
11520 3e 6e 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28  >nExpr;.  while(
11530 20 6e 53 65 74 50 32 20 29 7b 0a 20 20 20 20 73   nSetP2 ){.    s
11540 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
11550 50 32 28 76 2c 20 61 53 65 74 50 32 5b 2d 2d 6e  P2(v, aSetP2[--n
11560 53 65 74 50 32 5d 2c 20 6e 43 6f 6c 29 3b 0a 20  SetP2], nCol);. 
11570 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
11580 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
11590 6e 63 65 73 20 75 73 65 64 20 62 79 20 65 69 74  nces used by eit
115a0 68 65 72 20 74 68 65 20 4f 52 44 45 52 20 42 59  her the ORDER BY
115b0 20 63 6c 61 75 73 65 20 6f 72 0a 20 20 2a 2a 20   clause or.  ** 
115c0 62 79 20 61 6e 79 20 74 65 6d 70 6f 72 61 72 79  by any temporary
115d0 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74   tables needed t
115e0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
115f0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
11600 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65  .  ** Attach the
11610 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
11620 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72  re to all tempor
11630 61 72 79 20 74 61 62 6c 65 73 2e 20 20 49 6e 76  ary tables.  Inv
11640 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 4f 52 44  oke the.  ** ORD
11650 45 52 20 42 59 20 70 72 6f 63 65 73 73 69 6e 67  ER BY processing
11660 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
11670 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
11680 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
11690 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62  section is run b
116a0 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  y the right-most
116b0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
116c0 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c  t only..  ** SEL
116d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
116e0 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79  o the left alway
116f0 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  s skip this part
11700 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
11710 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69  t.  ** SELECT mi
11720 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68  ght also skip th
11730 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61  is part if it ha
11740 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
11750 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f  ause and.  ** no
11760 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65   temp tables are
11770 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
11780 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 7c    if( pOrderBy |
11790 7c 20 70 2d 3e 75 73 65 73 45 70 68 6d 20 29 7b  | p->usesEphm ){
117a0 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
117b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117c0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
117d0 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  er */.    KeyInf
117e0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20  o *pKeyInfo;    
117f0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
11800 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
11810 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
11820 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   */.    Select *
11830 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
11840 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
11850 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c  ping through SEL
11860 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  ECT statements *
11870 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 43 6f  /.    int nKeyCo
11880 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
11890 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
118a0 20 65 6e 74 72 69 65 73 20 69 6e 20 70 4b 65 79   entries in pKey
118b0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 2a 2f 0a  Info->aCol[] */.
118c0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70      CollSeq **ap
118d0 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
118e0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
118f0 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66   through pKeyInf
11900 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20  o->aColl[] */.  
11910 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 43 6f 70    CollSeq **aCop
11920 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
11930 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 4b 65  /* A copy of pKe
11940 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a  yInfo->aColl[] *
11950 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
11960 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20  ->pRightmost==p 
11970 29 3b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20 3d  );.    nKeyCol =
11980 20 6e 43 6f 6c 20 2b 20 28 70 4f 72 64 65 72 42   nCol + (pOrderB
11990 79 20 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y ? pOrderBy->nE
119a0 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 70 4b  xpr : 0);.    pK
119b0 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
119c0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
119d0 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f  sizeof(*pKeyInfo
11a00 29 2b 6e 4b 65 79 43 6f 6c 2a 28 73 69 7a 65 6f  )+nKeyCol*(sizeo
11a10 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 31 29  f(CollSeq*) + 1)
11a20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79  );.    if( !pKey
11a30 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  Info ){.      rc
11a40 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
11a50 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  .      goto mult
11a60 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
11a70 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66    }..    pKeyInf
11a80 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  o->enc = ENC(pPa
11a90 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4b  rse->db);.    pK
11aa0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d  eyInfo->nField =
11ab0 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28   nCol;..    for(
11ac0 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79  i=0, apColl=pKey
11ad0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e  Info->aColl; i<n
11ae0 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c  Col; i++, apColl
11af0 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f  ++){.      *apCo
11b00 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
11b10 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
11b20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
11b30 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20   0==*apColl ){. 
11b40 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
11b50 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
11b60 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
11b70 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
11b80 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
11b90 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
11ba0 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
11bb0 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
11bc0 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
11bd0 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
11be0 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
11bf0 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
11c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
11c10 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
11c20 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
11c30 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
11c40 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
11c50 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
11c60 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
11c70 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
11c80 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
11c90 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
11ca0 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
11cb0 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
11cc0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
11cd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11ce0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
11cf0 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
11d00 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
11d10 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
11d20 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
11d30 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
11d40 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
11d50 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
11d60 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[i] = -1;.   
11d70 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
11d80 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
11d90 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
11da0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 54 65  rList_item *pOTe
11db0 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  rm = pOrderBy->a
11dc0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64  ;.      int nOrd
11dd0 65 72 42 79 45 78 70 72 20 3d 20 70 4f 72 64 65  erByExpr = pOrde
11de0 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
11df0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
11e00 20 20 75 38 20 2a 70 53 6f 72 74 4f 72 64 65 72    u8 *pSortOrder
11e10 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 75 73  ;..      /* Reus
11e20 65 20 74 68 65 20 73 61 6d 65 20 70 4b 65 79 49  e the same pKeyI
11e30 6e 66 6f 20 66 6f 72 20 74 68 65 20 4f 52 44 45  nfo for the ORDE
11e40 52 20 42 59 20 61 73 20 77 61 73 20 75 73 65 64  R BY as was used
11e50 20 61 62 6f 76 65 20 66 6f 72 0a 20 20 20 20 20   above for.     
11e60 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   ** the compound
11e70 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
11e80 74 73 2e 20 20 45 78 63 65 70 74 20 77 65 20 68  ts.  Except we h
11e90 61 76 65 20 74 6f 20 63 68 61 6e 67 65 20 6f 75  ave to change ou
11ea0 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70  t the.      ** p
11eb0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d  KeyInfo->aColl[]
11ec0 20 76 61 6c 75 65 73 2e 20 20 53 6f 6d 65 20 6f   values.  Some o
11ed0 66 20 74 68 65 20 61 43 6f 6c 6c 5b 5d 20 76 61  f the aColl[] va
11ee0 6c 75 65 73 20 77 69 6c 6c 20 62 65 0a 20 20 20  lues will be.   
11ef0 20 20 20 2a 2a 20 72 65 75 73 65 64 20 77 68 65     ** reused whe
11f00 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74  n constructing t
11f10 68 65 20 70 4b 65 79 49 6e 66 6f 20 66 6f 72 20  he pKeyInfo for 
11f20 74 68 65 20 4f 52 44 45 52 20 42 59 2c 20 73 6f  the ORDER BY, so
11f30 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 61   make.      ** a
11f40 20 63 6f 70 79 2e 20 20 53 75 66 66 69 63 69 65   copy.  Sufficie
11f50 6e 74 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64  nt space to hold
11f60 20 62 6f 74 68 20 74 68 65 20 6e 43 6f 6c 20 65   both the nCol e
11f70 6e 74 72 69 65 73 20 66 6f 72 0a 20 20 20 20 20  ntries for.     
11f80 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   ** the compound
11f90 20 73 65 6c 65 63 74 20 61 6e 64 20 74 68 65 20   select and the 
11fa0 6e 4f 72 64 65 72 62 79 45 78 70 72 20 65 6e 74  nOrderbyExpr ent
11fb0 72 69 65 73 20 66 6f 72 20 74 68 65 20 4f 52 44  ries for the ORD
11fc0 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 77  ER BY.      ** w
11fd0 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f  as allocated abo
11fe0 76 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  ve.  But we need
11ff0 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 63 6f 6d   to move the com
12000 70 6f 75 6e 64 20 73 65 6c 65 63 74 0a 20 20 20  pound select.   
12010 20 20 20 2a 2a 20 65 6e 74 72 69 65 73 20 6f 75     ** entries ou
12020 74 20 6f 66 20 74 68 65 20 77 61 79 20 62 65 66  t of the way bef
12030 6f 72 65 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  ore constructing
12040 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65 6e   the ORDER BY en
12050 74 72 69 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  tries..      ** 
12060 4d 6f 76 65 20 74 68 65 20 63 6f 6d 70 6f 75 6e  Move the compoun
12070 64 20 73 65 6c 65 63 74 20 65 6e 74 72 69 65 73  d select entries
12080 20 69 6e 74 6f 20 61 43 6f 70 79 5b 5d 20 77 68   into aCopy[] wh
12090 65 72 65 20 74 68 65 79 20 63 61 6e 20 62 65 0a  ere they can be.
120a0 20 20 20 20 20 20 2a 2a 20 61 63 63 65 73 73 65        ** accesse
120b0 64 20 61 6e 64 20 72 65 75 73 65 64 20 77 68 65  d and reused whe
120c0 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74  n constructing t
120d0 68 65 20 4f 52 44 45 52 20 42 59 20 65 6e 74 72  he ORDER BY entr
120e0 69 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65  ies..      ** Be
120f0 63 61 75 73 65 20 6e 43 6f 6c 20 6d 69 67 68 74  cause nCol might
12100 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
12110 20 6f 72 20 6c 65 73 73 20 74 68 61 6e 20 6e 4f   or less than nO
12120 72 64 65 72 42 79 45 78 70 72 0a 20 20 20 20 20  rderByExpr.     
12130 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 75   ** we have to u
12140 73 65 20 6d 65 6d 6d 6f 76 65 28 29 20 77 68 65  se memmove() whe
12150 6e 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 70 79  n doing the copy
12160 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
12170 20 61 43 6f 70 79 20 3d 20 26 70 4b 65 79 49 6e   aCopy = &pKeyIn
12180 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72  fo->aColl[nOrder
12190 42 79 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 70  ByExpr];.      p
121a0 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79  SortOrder = pKey
121b0 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
121c0 20 3d 20 28 75 38 2a 29 26 61 43 6f 70 79 5b 6e   = (u8*)&aCopy[n
121d0 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 6d  Col];.      memm
121e0 6f 76 65 28 61 43 6f 70 79 2c 20 70 4b 65 79 49  ove(aCopy, pKeyI
121f0 6e 66 6f 2d 3e 61 43 6f 6c 6c 2c 20 6e 43 6f 6c  nfo->aColl, nCol
12200 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
12210 29 29 3b 0a 0a 20 20 20 20 20 20 61 70 43 6f 6c  ));..      apCol
12220 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  l = pKeyInfo->aC
12230 6f 6c 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  oll;.      for(i
12240 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 45 78  =0; i<nOrderByEx
12250 70 72 3b 20 69 2b 2b 2c 20 70 4f 54 65 72 6d 2b  pr; i++, pOTerm+
12260 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 2c 20 70 53 6f  +, apColl++, pSo
12270 72 74 4f 72 64 65 72 2b 2b 29 7b 0a 20 20 20 20  rtOrder++){.    
12280 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
12290 3d 20 70 4f 54 65 72 6d 2d 3e 70 45 78 70 72 3b  = pOTerm->pExpr;
122a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 45  .        if( (pE
122b0 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
122c0 45 78 70 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20  ExpCollate) ){. 
122d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
122e0 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 21 3d 30   pExpr->pColl!=0
122f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 61   );.          *a
12300 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70  pColl = pExpr->p
12310 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65  Coll;.        }e
12320 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  lse{.          *
12330 61 70 43 6f 6c 6c 20 3d 20 61 43 6f 70 79 5b 70  apColl = aCopy[p
12340 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a  Expr->iColumn];.
12350 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12360 20 20 2a 70 53 6f 72 74 4f 72 64 65 72 20 3d 20    *pSortOrder = 
12370 70 4f 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65  pOTerm->sortOrde
12380 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
12390 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
123a0 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20  htmost==p );.   
123b0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
123c0 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 3e 3d 30  drOpenEphm[2]>=0
123d0 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d   );.      addr =
123e0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
123f0 5b 32 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [2];.      sqlit
12400 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
12410 2c 20 61 64 64 72 2c 20 70 2d 3e 70 4f 72 64 65  , addr, p->pOrde
12420 72 42 79 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20  rBy->nExpr+2);. 
12430 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e       pKeyInfo->n
12440 46 69 65 6c 64 20 3d 20 6e 4f 72 64 65 72 42 79  Field = nOrderBy
12450 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
12460 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
12470 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29  v, addr, (char*)
12480 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
12490 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
124a0 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
124b0 30 3b 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74  0;.      generat
124c0 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65  eSortTail(pParse
124d0 2c 20 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73  , p, v, p->pELis
124e0 74 2d 3e 6e 45 78 70 72 2c 20 26 64 65 73 74 29  t->nExpr, &dest)
124f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
12500 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 49 6e  ite3_free(pKeyIn
12510 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f  fo);.  }..multi_
12520 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44  select_end:.  pD
12530 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 64 65 73 74  est->iMem = dest
12540 2e 69 4d 65 6d 3b 0a 20 20 72 65 74 75 72 6e 20  .iMem;.  return 
12550 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
12560 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
12570 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
12580 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12590 4d 49 54 5f 56 49 45 57 0a 2f 2a 20 46 6f 72 77  MIT_VIEW./* Forw
125a0 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73  ard Declarations
125b0 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
125c0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 73 71  substExprList(sq
125d0 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74  lite3*, ExprList
125e0 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
125f0 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  *);.static void 
12600 73 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69  substSelect(sqli
12610 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20  te3*, Select *, 
12620 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29  int, ExprList *)
12630 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  ;../*.** Scan th
12640 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73  rough the expres
12650 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70  sion pExpr.  Rep
12660 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72  lace every refer
12670 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c  ence to.** a col
12680 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d  umn in table num
12690 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20  ber iTable with 
126a0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43  a copy of the iC
126b0 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72  olumn-th.** entr
126c0 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42  y in pEList.  (B
126d0 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e  ut leave referen
126e0 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44  ces to the ROWID
126f0 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68   column .** unch
12700 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  anged.).**.** Th
12710 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61  is routine is pa
12720 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65  rt of the flatte
12730 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20  ning procedure. 
12740 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77   A subquery.** w
12750 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20  hose result set 
12760 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45  is defined by pE
12770 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20  List appears as 
12780 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20  entry in the.** 
12790 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
127a0 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61   SELECT such tha
127b0 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f  t the VDBE curso
127c0 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  r assigned to th
127d0 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73  at.** FORM claus
127e0 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c  e entry is iTabl
127f0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
12800 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73   make the necess
12810 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  ary .** changes 
12820 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74  to pExpr so that
12830 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63   it refers direc
12840 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63  tly to the sourc
12850 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68  e table.** of th
12860 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65  e subquery rathe
12870 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
12880 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
12890 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
128a0 20 73 75 62 73 74 45 78 70 72 28 0a 20 20 73 71   substExpr(.  sq
128b0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
128c0 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
128d0 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69  oc errors to thi
128e0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  s connection */.
128f0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
12900 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e        /* Expr in
12910 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74   which substitut
12920 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20  ion occurs */.  
12930 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
12940 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
12950 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a  be substituted *
12960 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
12970 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74  List    /* Subst
12980 69 74 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e  itute expression
12990 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45  s */.){.  if( pE
129a0 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
129b0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
129c0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
129d0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Expr->iTable==iT
129e0 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20  able ){.    if( 
129f0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
12a00 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
12a10 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
12a20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12a30 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Expr *pNew;.    
12a40 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
12a50 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43  !=0 && pExpr->iC
12a60 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45  olumn<pEList->nE
12a70 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  xpr );.      ass
12a80 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
12a90 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
12aa0 52 69 67 68 74 3d 3d 30 20 26 26 20 70 45 78 70  Right==0 && pExp
12ab0 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  r->pList==0 );. 
12ac0 20 20 20 20 20 70 4e 65 77 20 3d 20 70 45 4c 69       pNew = pELi
12ad0 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f  st->a[pExpr->iCo
12ae0 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20  lumn].pExpr;.   
12af0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21     assert( pNew!
12b00 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
12b10 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70  r->op = pNew->op
12b20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12b30 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
12b40 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
12b50 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
12b60 78 70 72 44 75 70 28 64 62 2c 20 70 4e 65 77 2d  xprDup(db, pNew-
12b70 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61  >pLeft);.      a
12b80 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52  ssert( pExpr->pR
12b90 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
12ba0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
12bb0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
12bc0 64 62 2c 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  db, pNew->pRight
12bd0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
12be0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
12bf0 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
12c00 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  >pList = sqlite3
12c10 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
12c20 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  pNew->pList);.  
12c30 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
12c40 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65  e = pNew->iTable
12c50 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
12c60 54 61 62 20 3d 20 70 4e 65 77 2d 3e 70 54 61 62  Tab = pNew->pTab
12c70 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
12c80 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69  Column = pNew->i
12c90 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45  Column;.      pE
12ca0 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77  xpr->iAgg = pNew
12cb0 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73 71  ->iAgg;.      sq
12cc0 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64  lite3TokenCopy(d
12cd0 62 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  b, &pExpr->token
12ce0 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b  , &pNew->token);
12cf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f  .      sqlite3To
12d00 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 45 78  kenCopy(db, &pEx
12d10 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d  pr->span, &pNew-
12d20 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 70 45  >span);.      pE
12d30 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  xpr->pSelect = s
12d40 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
12d50 64 62 2c 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63  db, pNew->pSelec
12d60 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  t);.      pExpr-
12d70 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 66  >flags = pNew->f
12d80 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  lags;.    }.  }e
12d90 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78  lse{.    substEx
12da0 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c  pr(db, pExpr->pL
12db0 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  eft, iTable, pEL
12dc0 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
12dd0 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  xpr(db, pExpr->p
12de0 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70  Right, iTable, p
12df0 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
12e00 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70  tSelect(db, pExp
12e10 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  r->pSelect, iTab
12e20 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
12e30 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
12e40 62 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c  b, pExpr->pList,
12e50 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
12e60 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
12e70 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
12e80 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
12e90 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  ,         /* Rep
12ea0 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
12eb0 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72  s here */.  Expr
12ec0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
12ed0 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e   /* List to scan
12ee0 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f   and in which to
12ef0 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 65   make substitute
12f00 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  s */.  int iTabl
12f10 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
12f20 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74  able to be subst
12f30 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  ituted */.  Expr
12f40 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
12f50 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76   /* Substitute v
12f60 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  alues */.){.  in
12f70 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
12f80 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
12f90 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
12fa0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
12fb0 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c     substExpr(db,
12fc0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
12fd0 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  pr, iTable, pELi
12fe0 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  st);.  }.}.stati
12ff0 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65  c void substSele
13000 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ct(.  sqlite3 *d
13010 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  b,         /* Re
13020 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
13030 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c  rs here */.  Sel
13040 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
13050 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74    /* SELECT stat
13060 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74  ement in which t
13070 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
13080 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  ions */.  int iT
13090 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
130a0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65  * Table to be re
130b0 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72  placed */.  Expr
130c0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
130d0 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76   /* Substitute v
130e0 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  alues */.){.  if
130f0 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !p ) return;. 
13100 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
13110 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54  b, p->pEList, iT
13120 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
13130 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
13140 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  b, p->pGroupBy, 
13150 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
13160 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
13170 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
13180 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
13190 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 64  );.  substExpr(d
131a0 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69  b, p->pHaving, i
131b0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
131c0 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20    substExpr(db, 
131d0 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c  p->pWhere, iTabl
131e0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
131f0 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d  bstSelect(db, p-
13200 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c  >pPrior, iTable,
13210 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23 65 6e 64   pEList);.}.#end
13220 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
13230 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
13240 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
13250 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
13260 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13270 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
13280 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
13290 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65 65  in order to spee
132a0 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20  d.** execution. 
132b0 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69 66   It returns 1 if
132c0 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65   it makes change
132d0 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c  s and 0 if no fl
132e0 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75  attening.** occu
132f0 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64  rs..**.** To und
13300 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63  erstand the conc
13310 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e  ept of flattenin
13320 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20  g, consider the 
13330 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65  following.** que
13340 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ry:.**.**     SE
13350 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c  LECT a FROM (SEL
13360 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
13370 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
13380 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a  ) WHERE a>5.**.*
13390 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61  * The default wa
133a0 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  y of implementin
133b0 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  g this query is 
133c0 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a  to execute the.*
133d0 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74  * subquery first
133e0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
133f0 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70  esults in a temp
13400 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65  orary table, the
13410 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74  n.** run the out
13420 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74  er query on that
13430 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
13440 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73  .  This requires
13450 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f   two.** passes o
13460 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46  ver the data.  F
13470 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61  urthermore, beca
13480 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  use the temporar
13490 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e  y table.** has n
134a0 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57  o indices, the W
134b0 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74  HERE clause on t
134c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63  he outer query c
134d0 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69  annot be.** opti
134e0 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mized..**.** Thi
134f0 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
13500 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75  ts to rewrite qu
13510 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68  eries such as th
13520 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20  e above into.** 
13530 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65  a single flat se
13540 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a  lect, like this:
13550 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
13560 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
13570 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41  t1 WHERE z<100 A
13580 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  ND a>5.**.** The
13590 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
135a0 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69  for this simpifi
135b0 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65  cation gives the
135c0 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20   same result.** 
135d0 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20  but only has to 
135e0 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e  scan the data on
135f0 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65  ce.  And because
13600 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a   indices might .
13610 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20  ** exist on the 
13620 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70  table t1, a comp
13630 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65  lete scan of the
13640 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a   data might be.*
13650 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a  * avoided..**.**
13660 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f   Flattening is o
13670 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
13680 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
13690 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
136a0 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65  **.**   (1)  The
136b0 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
136c0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
136d0 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67   not both use ag
136e0 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
136f0 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75    (2)  The subqu
13700 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
13710 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f  gregate or the o
13720 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
13730 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
13740 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75    (3)  The subqu
13750 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72  ery is not the r
13760 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
13770 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69  a left outer joi
13780 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  n, or.**        
13790 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
137a0 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f 69  not itself a joi
137b0 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33 30 36  n.  (Ticket #306
137c0 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54  ).**.**   (4)  T
137d0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
137e0 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74  ot DISTINCT or t
137f0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
13800 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
13810 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20 73  .**   (5)  The s
13820 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
13830 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f  ISTINCT or the o
13840 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
13850 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
13860 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
13870 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73  .**   (6)  The s
13880 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
13890 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
138a0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
138b0 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
138c0 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a      DISTINCT..**
138d0 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73  .**   (7)  The s
138e0 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52  ubquery has a FR
138f0 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
13900 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71     (8)  The subq
13910 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
13920 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
13930 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
13940 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
13950 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75    (9)  The subqu
13960 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
13970 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
13980 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
13990 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
139a0 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
139b0 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73 75  **  (10)  The su
139c0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
139d0 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
139e0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
139f0 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20  y does not.**   
13a00 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a       use LIMIT..
13a10 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65  **.**  (11)  The
13a20 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
13a30 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
13a40 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f   not both have O
13a50 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e  RDER BY clauses.
13a60 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54 68  .**.**  (12)  Th
13a70 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
13a80 74 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  t the right term
13a90 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
13aa0 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a 20   JOIN or the.** 
13ab0 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20         subquery 
13ac0 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  has no WHERE cla
13ad0 75 73 65 2e 20 20 28 61 64 64 65 64 20 62 79 20  use.  (added by 
13ae0 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a 0a  ticket #350).**.
13af0 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75  **  (13)  The su
13b00 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72  bquery and outer
13b10 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
13b20 74 68 20 75 73 65 20 4c 49 4d 49 54 0a 2a 2a 0a  th use LIMIT.**.
13b30 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75  **  (14)  The su
13b40 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
13b50 75 73 65 20 4f 46 46 53 45 54 0a 2a 2a 0a 2a 2a  use OFFSET.**.**
13b60 20 20 28 31 35 29 20 20 54 68 65 20 6f 75 74 65    (15)  The oute
13b70 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70  r query is not p
13b80 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  art of a compoun
13b90 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a  d select or the.
13ba0 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65  **        subque
13bb0 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ry does not have
13bc0 20 62 6f 74 68 20 61 6e 20 4f 52 44 45 52 20 42   both an ORDER B
13bd0 59 20 61 6e 64 20 61 20 4c 49 4d 49 54 20 63 6c  Y and a LIMIT cl
13be0 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ause..**        
13bf0 28 53 65 65 20 74 69 63 6b 65 74 20 23 32 33 33  (See ticket #233
13c00 39 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  9).**.** In this
13c10 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70   routine, the "p
13c20 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  " parameter is a
13c30 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
13c40 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20  outer query..** 
13c50 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
13c60 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  p->pSrc->a[iFrom
13c70 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75  ].  isAgg is tru
13c80 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71  e if the outer q
13c90 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67  uery.** uses agg
13ca0 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71  regates and subq
13cb0 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75  ueryIsAgg is tru
13cc0 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
13cd0 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
13ce0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74  s..**.** If flat
13cf0 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74  tening is not at
13d00 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f  tempted, this ro
13d10 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
13d20 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a   and returns 0..
13d30 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
13d40 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68   is attempted th
13d50 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
13d60 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ns 1..**.** All 
13d70 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
13d80 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20  n analysis must 
13d90 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68  occur on both th
13da0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
13db0 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72  d.** the subquer
13dc0 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  y before this ro
13dd0 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73  utine runs..*/.s
13de0 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65  tatic int flatte
13df0 6e 53 75 62 71 75 65 72 79 28 0a 20 20 73 71 6c  nSubquery(.  sql
13e00 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
13e10 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
13e20 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  nnection */.  Se
13e30 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
13e40 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
13e50 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54   or outer SELECT
13e60 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
13e70 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
13e80 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
13e90 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   p->pSrc->a[] of
13ea0 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75   the inner subqu
13eb0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ery */.  int isA
13ec0 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gg,           /*
13ed0 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53   True if outer S
13ee0 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65  ELECT uses aggre
13ef0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
13f00 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79  /.  int subquery
13f10 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65  IsAgg    /* True
13f20 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
13f30 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
13f40 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
13f50 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
13f60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
13f70 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
13f80 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c  query" */.  SrcL
13f90 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
13fa0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
13fb0 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
13fc0 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
13fd0 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f  st *pSubSrc;   /
13fe0 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
13ff0 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
14000 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  y */.  ExprList 
14010 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  *pList;    /* Th
14020 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
14030 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
14040 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74  */.  int iParent
14050 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45  ;        /* VDBE
14060 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
14070 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c  f the pSub resul
14080 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65  t set temp table
14090 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
140a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
140b0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45  p counter */.  E
140c0 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
140d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140e0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
140f0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
14100 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
14110 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65  ubitem;   /* The
14120 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 0a 20 20   subquery */..  
14130 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
14140 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  if flattening is
14150 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74   permitted.  Ret
14160 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20  urn 0 if not..  
14170 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  */.  if( p==0 ) 
14180 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63  return 0;.  pSrc
14190 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
141a0 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46  sert( pSrc && iF
141b0 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c  rom>=0 && iFrom<
141c0 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  pSrc->nSrc );.  
141d0 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63  pSubitem = &pSrc
141e0 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 70 53  ->a[iFrom];.  pS
141f0 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  ub = pSubitem->p
14200 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74  Select;.  assert
14210 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69  ( pSub!=0 );.  i
14220 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71  f( isAgg && subq
14230 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
14240 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
14250 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
14260 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69  tion (1)  */.  i
14270 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
14280 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31   && pSrc->nSrc>1
14290 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
142a0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
142b0 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70  tion (2)  */.  p
142c0 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
142d0 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
142e0 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50  SubSrc );.  /* P
142f0 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20  rior to version 
14300 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49  3.1.2, when LIMI
14310 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64  T and OFFSET had
14320 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f   to be simple co
14330 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f  nstants,.  ** no
14340 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  t arbitrary expr
14350 65 73 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c  esssions, we all
14360 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e  owed some combin
14370 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64  ing of LIMIT and
14380 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
14390 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20  ause they could 
143a0 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63  be computed at c
143b0 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75  ompile-time.  Bu
143c0 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  t when LIMIT and
143d0 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
143e0 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78  ame arbitrary ex
143f0 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65  pressions, we we
14400 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64  re forced to add
14410 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31   restrictions (1
14420 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29  3).  ** and (14)
14430 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  . */.  if( pSub-
14440 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c  >pLimit && p->pL
14450 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
14460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14470 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33   Restriction (13
14480 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
14490 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72  >pOffset ) retur
144a0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
144b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
144c0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34   Restriction (14
144d0 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 52  ) */.  if( p->pR
144e0 69 67 68 74 6d 6f 73 74 20 26 26 20 70 53 75 62  ightmost && pSub
144f0 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 53 75 62  ->pLimit && pSub
14500 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
14510 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
14520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14540 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
14550 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20  ction (15) */.  
14560 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d  }.  if( pSubSrc-
14570 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  >nSrc==0 ) retur
14580 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
14590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
145a0 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a  striction (7)  *
145b0 2f 0a 20 20 69 66 28 20 28 70 53 75 62 2d 3e 69  /.  if( (pSub->i
145c0 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75  sDistinct || pSu
145d0 62 2d 3e 70 4c 69 6d 69 74 29 20 0a 20 20 20 20  b->pLimit) .    
145e0 20 20 20 20 20 26 26 20 28 70 53 72 63 2d 3e 6e       && (pSrc->n
145f0 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20  Src>1 || isAgg) 
14600 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ){          /* R
14610 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29 28  estrictions (4)(
14620 35 29 28 38 29 28 39 29 20 2a 2f 0a 20 20 20 20  5)(8)(9) */.    
14630 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
14640 20 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 69   .  }.  if( p->i
14650 73 44 69 73 74 69 6e 63 74 20 26 26 20 73 75 62  sDistinct && sub
14660 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74  queryIsAgg ) ret
14670 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f  urn 0;         /
14680 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36  * Restriction (6
14690 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  )  */.  if( (p->
146a0 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20  disallowOrderBy 
146b0 7c 7c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 20  || p->pOrderBy) 
146c0 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
146d0 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  y ){.     return
146e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
146f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14710 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31   Restriction (11
14720 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ) */.  }..  /* R
14730 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49  estriction 3:  I
14740 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
14750 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73  s a join, make s
14760 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ure the subquery
14770 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73   is .  ** not us
14780 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20  ed as the right 
14790 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75  operand of an ou
147a0 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70  ter join.  Examp
147b0 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a  les of why this.
147c0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f    ** is not allo
147d0 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
147e0 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
147f0 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f  UTER JOIN (t2 JO
14800 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a  IN t3).  **.  **
14810 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
14820 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
14830 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
14840 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
14850 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
14860 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20   JOIN t3.  **.  
14870 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20  ** which is not 
14880 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20  at all the same 
14890 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  thing..  */.  if
148a0 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e  ( pSubSrc->nSrc>
148b0 31 20 26 26 20 28 70 53 75 62 69 74 65 6d 2d 3e  1 && (pSubitem->
148c0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
148d0 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  TER)!=0 ){.    r
148e0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
148f0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  /* Restriction 1
14900 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  2:  If the subqu
14910 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
14920 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
14930 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f  ft outer.  ** jo
14940 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
14950 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e  e subquery has n
14960 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  o WHERE clause..
14970 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73    ** An examples
14980 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20   of why this is 
14990 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
149a0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
149b0 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
149c0 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
149d0 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30   t2 WHERE t2.x>0
149e0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
149f0 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
14a00 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
14a10 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
14a20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
14a30 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52  ER JOIN t2) WHER
14a40 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20  E t2.x>0.  **.  
14a50 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e  ** But the t2.x>
14a60 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61  0 test will alwa
14a70 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c  ys fail on a NUL
14a80 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69  L row of t2, whi
14a90 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76  ch.  ** effectiv
14aa0 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65  ely converts the
14ab0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f   OUTER JOIN into
14ac0 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a   an INNER JOIN..
14ad0 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62    */.  if( (pSub
14ae0 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  item->jointype &
14af0 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 26 26   JT_OUTER)!=0 &&
14b00 20 70 53 75 62 2d 3e 70 57 68 65 72 65 21 3d 30   pSub->pWhere!=0
14b10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
14b20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
14b30 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
14b40 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c 61  nt, it means fla
14b50 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
14b60 74 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a  tted for the.  *
14b70 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79  * iFrom-th entry
14b80 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
14b90 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74 65 72  use in the outer
14ba0 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20   query..  */..  
14bb0 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74  /* Move all of t
14bc0 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73  he FROM elements
14bd0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
14be0 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74   into the.  ** t
14bf0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
14c00 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
14c10 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  y.  Before doing
14c20 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a   this, remember.
14c30 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20    ** the cursor 
14c40 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f  number for the o
14c50 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75  riginal outer qu
14c60 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  ery FROM element
14c70 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74   in.  ** iParent
14c80 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63  .  The iParent c
14c90 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72  ursor will never
14ca0 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65   be used.  Subse
14cb0 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20  quent code.  ** 
14cc0 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73  will scan expres
14cd0 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f  sions looking fo
14ce0 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65  r iParent refere
14cf0 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65  nces and replace
14d00 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65  .  ** those refe
14d10 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72  rences with expr
14d20 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73  essions that res
14d30 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71  olve to the subq
14d40 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65  uery FROM.  ** e
14d50 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e  lements we are n
14d60 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20  ow copying in.. 
14d70 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d 20   */.  iParent = 
14d80 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f  pSubitem->iCurso
14d90 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e  r;.  {.    int n
14da0 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63  SubSrc = pSubSrc
14db0 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74 20  ->nSrc;.    int 
14dc0 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69  jointype = pSubi
14dd0 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 0a  tem->jointype;..
14de0 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
14df0 65 54 61 62 6c 65 28 70 53 75 62 69 74 65 6d 2d  eTable(pSubitem-
14e00 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69  >pTab);.    sqli
14e10 74 65 33 5f 66 72 65 65 28 70 53 75 62 69 74 65  te3_free(pSubite
14e20 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
14e30 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14e40 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pSubitem->zName)
14e50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
14e60 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  ee(pSubitem->zAl
14e70 69 61 73 29 3b 0a 20 20 20 20 70 53 75 62 69 74  ias);.    pSubit
14e80 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  em->pTab = 0;.  
14e90 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74    pSubitem->zDat
14ea0 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 20 20 70  abase = 0;.    p
14eb0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  Subitem->zName =
14ec0 20 30 3b 0a 20 20 20 20 70 53 75 62 69 74 65 6d   0;.    pSubitem
14ed0 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->zAlias = 0;.  
14ee0 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20    if( nSubSrc>1 
14ef0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 74  ){.      int ext
14f00 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20 31  ra = nSubSrc - 1
14f10 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  ;.      for(i=1;
14f20 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29   i<nSubSrc; i++)
14f30 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 20 3d  {.        pSrc =
14f40 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
14f50 70 70 65 6e 64 28 64 62 2c 20 70 53 72 63 2c 20  ppend(db, pSrc, 
14f60 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  0, 0);.        i
14f70 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( pSrc==0 ){.  
14f80 20 20 20 20 20 20 20 20 70 2d 3e 70 53 72 63 20          p->pSrc 
14f90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
14fa0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
14fb0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
14fc0 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b   p->pSrc = pSrc;
14fd0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53 72  .      for(i=pSr
14fe0 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78 74  c->nSrc-1; i-ext
14ff0 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b  ra>=iFrom; i--){
15000 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e 61  .        pSrc->a
15010 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 2d  [i] = pSrc->a[i-
15020 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d 0a  extra];.      }.
15030 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
15040 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b  0; i<nSubSrc; i+
15050 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e  +){.      pSrc->
15060 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75  a[i+iFrom] = pSu
15070 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  bSrc->a[i];.    
15080 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72    memset(&pSubSr
15090 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65  c->a[i], 0, size
150a0 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  of(pSubSrc->a[i]
150b0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ));.    }.    pS
150c0 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69  rc->a[iFrom].joi
150d0 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65  ntype = jointype
150e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
150f0 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69  begin substituti
15100 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75  ng subquery resu
15110 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
15120 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72 65 66  ns for .  ** ref
15130 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69  erences to the i
15140 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75  Parent in the ou
15150 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2a 20  ter query..  ** 
15160 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20  .  ** Example:. 
15170 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45 43   **.  **   SELEC
15180 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d  T a+5, b*10 FROM
15190 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20   (SELECT x*3 AS 
151a0 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f  a, y+10 AS b FRO
151b0 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b  M t1) WHERE a>b;
151c0 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20  .  **   \       
151d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
151e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62  ____________ sub
151f0 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
15200 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 2a  /          /.  *
15210 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
15220 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
15230 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
15240 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
15250 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a  ______/.  **.  *
15260 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65  * We look at eve
15270 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
15280 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
15290 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
152a0 20 77 65 20 73 65 65 0a 20 20 2a 2a 20 22 61 22   we see.  ** "a"
152b0 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
152c0 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70  x*3" and every p
152d0 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20  lace we see "b" 
152e0 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79  we substitute "y
152f0 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 70 4c 69  +10"..  */.  pLi
15300 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
15310 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
15320 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
15330 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
15340 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
15350 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26  >a[i].zName==0 &
15360 26 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74  & (pExpr = pList
15370 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73  ->a[i].pExpr)->s
15380 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  pan.z!=0 ){.    
15390 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e    pList->a[i].zN
153a0 61 6d 65 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ame = .         
153b0 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74 72      sqlite3DbStr
153c0 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
153d0 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70  pExpr->span.z, p
153e0 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  Expr->span.n);. 
153f0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 75 62 73 74     }.  }.  subst
15400 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e  ExprList(db, p->
15410 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c  pEList, iParent,
15420 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
15430 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20    if( isAgg ){. 
15440 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
15450 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
15460 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
15470 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75  >pEList);.    su
15480 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
15490 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
154a0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
154b0 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e    }.  if( pSub->
154c0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
154d0 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
154e0 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  rBy==0 );.    p-
154f0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  >pOrderBy = pSub
15500 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
15510 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pSub->pOrderBy =
15520 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
15530 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
15540 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
15550 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
15560 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
15570 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  >pEList);.  }.  
15580 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65  if( pSub->pWhere
15590 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d   ){.    pWhere =
155a0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
155b0 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65  db, pSub->pWhere
155c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
155d0 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
155e0 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
155f0 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Agg ){.    asser
15600 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  t( p->pHaving==0
15610 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69   );.    p->pHavi
15620 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  ng = p->pWhere;.
15630 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
15640 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75 62 73  pWhere;.    subs
15650 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61  tExpr(db, p->pHa
15660 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
15670 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
15680 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73    p->pHaving = s
15690 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
156a0 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20  , p->pHaving, . 
156b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
156d0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
156e0 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29  , pSub->pHaving)
156f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15700 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
15710 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79  .    p->pGroupBy
15720 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
15730 73 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  stDup(db, pSub->
15740 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c  pGroupBy);.  }el
15750 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  se{.    substExp
15760 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  r(db, p->pWhere,
15770 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
15780 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
15790 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
157a0 45 78 70 72 41 6e 64 28 64 62 2c 20 70 2d 3e 70  ExprAnd(db, p->p
157b0 57 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a  Where, pWhere);.
157c0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c    }..  /* The fl
157d0 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73  attened query is
157e0 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74   distinct if eit
157f0 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72  her the inner or
15800 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20   the.  ** outer 
15810 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
15820 74 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73  t. .  */.  p->is
15830 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
15840 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62  Distinct || pSub
15850 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20  ->isDistinct;.. 
15860 20 2f 2a 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20   /*.  ** SELECT 
15870 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  ... FROM (SELECT
15880 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46   ... LIMIT a OFF
15890 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f  SET b) LIMIT x O
158a0 46 46 53 45 54 20 79 3b 0a 20 20 2a 2a 0a 20 20  FFSET y;.  **.  
158b0 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65  ** One is tempte
158c0 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20  d to try to add 
158d0 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69  a and b to combi
158e0 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20  ne the limits.  
158f0 42 75 74 20 74 68 69 73 0a 20 20 2a 2a 20 64 6f  But this.  ** do
15900 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65  es not work if e
15910 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e  ither limit is n
15920 65 67 61 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20  egative..  */.  
15930 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
15940 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69   ){.    p->pLimi
15950 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  t = pSub->pLimit
15960 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d  ;.    pSub->pLim
15970 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  it = 0;.  }..  /
15980 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65  * Finially, dele
15990 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20  te what is left 
159a0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
159b0 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  and return.  ** 
159c0 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  success..  */.  
159d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
159e0 65 74 65 28 70 53 75 62 29 3b 0a 20 20 72 65 74  ete(pSub);.  ret
159f0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
15a00 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
15a10 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  IEW */../*.** An
15a20 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54  alyze the SELECT
15a30 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
15a40 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
15a50 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a   to see if it.**
15a60 20 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d   is a min() or m
15a70 61 78 28 29 20 71 75 65 72 79 2e 20 52 65 74 75  ax() query. Retu
15a80 72 6e 20 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f  rn ORDERBY_MIN o
15a90 72 20 4f 52 44 45 52 42 59 5f 4d 41 58 20 69 66  r ORDERBY_MAX if
15aa0 20 0a 2a 2a 20 69 74 20 69 73 2c 20 6f 72 20 30   .** it is, or 0
15ab0 20 6f 74 68 65 72 77 69 73 65 2e 20 41 74 20 70   otherwise. At p
15ac0 72 65 73 65 6e 74 2c 20 61 20 71 75 65 72 79 20  resent, a query 
15ad0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  is considered to
15ae0 20 62 65 0a 2a 2a 20 61 20 6d 69 6e 28 29 2f 6d   be.** a min()/m
15af0 61 78 28 29 20 71 75 65 72 79 20 69 66 3a 0a 2a  ax() query if:.*
15b00 2a 0a 2a 2a 20 20 20 31 2e 20 54 68 65 72 65 20  *.**   1. There 
15b10 69 73 20 61 20 73 69 6e 67 6c 65 20 6f 62 6a 65  is a single obje
15b20 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ct in the FROM c
15b30 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 32  lause..**.**   2
15b40 2e 20 54 68 65 72 65 20 69 73 20 61 20 73 69 6e  . There is a sin
15b50 67 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  gle expression i
15b60 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
15b70 2c 20 61 6e 64 20 69 74 20 69 73 0a 2a 2a 20 20  , and it is.**  
15b80 20 20 20 20 65 69 74 68 65 72 20 6d 69 6e 28 78      either min(x
15b90 29 20 6f 72 20 6d 61 78 28 78 29 2c 20 77 68 65  ) or max(x), whe
15ba0 72 65 20 78 20 69 73 20 61 20 63 6f 6c 75 6d 6e  re x is a column
15bb0 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2f 0a 73   reference..*/.s
15bc0 74 61 74 69 63 20 69 6e 74 20 6d 69 6e 4d 61 78  tatic int minMax
15bd0 51 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61  Query(Parse *pPa
15be0 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
15bf0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  .  Expr *pExpr;.
15c00 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
15c10 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
15c20 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e  .  if( pEList->n
15c30 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
15c40 20 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b   ORDERBY_NORMAL;
15c50 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73  .  pExpr = pELis
15c60 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
15c70 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
15c80 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  >pList;.  if( pE
15c90 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
15ca0 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 70 45 4c 69  FUNCTION || pELi
15cb0 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d  st==0 || pEList-
15cc0 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
15cd0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 4c 69  rn 0;.  if( pELi
15ce0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  st->a[0].pExpr->
15cf0 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op!=TK_AGG_COLUM
15d00 4e 20 29 20 72 65 74 75 72 6e 20 4f 52 44 45 52  N ) return ORDER
15d10 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66 28  BY_NORMAL;.  if(
15d20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21   pExpr->token.n!
15d30 3d 33 20 29 20 72 65 74 75 72 6e 20 4f 52 44 45  =3 ) return ORDE
15d40 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66  RBY_NORMAL;.  if
15d50 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
15d60 70 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  p((char*)pExpr->
15d70 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29  token.z,"min",3)
15d80 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
15d90 6e 20 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20  n ORDERBY_MIN;. 
15da0 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
15db0 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
15dc0 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
15dd0 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"max",3)==0 ){.
15de0 20 20 20 20 72 65 74 75 72 6e 20 4f 52 44 45 52      return ORDER
15df0 42 59 5f 4d 41 58 3b 0a 20 20 7d 0a 20 20 72 65  BY_MAX;.  }.  re
15e00 74 75 72 6e 20 4f 52 44 45 52 42 59 5f 4e 4f 52  turn ORDERBY_NOR
15e10 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  MAL;.}../*.** Th
15e20 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c  is routine resol
15e30 76 65 73 20 61 6e 79 20 6e 61 6d 65 73 20 75 73  ves any names us
15e40 65 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ed in the result
15e50 20 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73   set of the.** s
15e60 75 70 70 6c 69 65 64 20 53 45 4c 45 43 54 20 73  upplied SELECT s
15e70 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65  tatement. If the
15e80 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15e90 74 20 62 65 69 6e 67 20 72 65 73 6f 6c 76 65 64  t being resolved
15ea0 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c  .** is a sub-sel
15eb0 65 63 74 2c 20 74 68 65 6e 20 70 4f 75 74 65 72  ect, then pOuter
15ec0 4e 43 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  NC is a pointer 
15ed0 74 6f 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65  to the NameConte
15ee0 78 74 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  xt .** of the pa
15ef0 72 65 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a  rent SELECT..*/.
15f00 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
15f10 74 52 65 73 6f 6c 76 65 28 0a 20 20 50 61 72 73  tResolve(.  Pars
15f20 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
15f30 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
15f40 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
15f50 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
15f60 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
15f70 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
15f80 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
15f90 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
15fa0 65 72 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75 74  erNC  /* The out
15fb0 65 72 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e  er name context.
15fc0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
15fd0 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
15fe0 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
15ff0 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20   /* Result set. 
16000 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
16010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16020 2f 2a 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69  /* For-loop vari
16030 61 62 6c 65 20 75 73 65 64 20 69 6e 20 6d 75 6c  able used in mul
16040 74 69 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a  tiple places */.
16050 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
16060 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C;           /* 
16070 4c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65  Local name-conte
16080 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
16090 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20   *pGroupBy;     
160a0 20 20 20 2f 2a 20 54 68 65 20 67 72 6f 75 70 20     /* The group 
160b0 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20  by clause */..  
160c0 2f 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  /* If this routi
160d0 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72  ne has run befor
160e0 65 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69  e, return immedi
160f0 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20  ately. */.  if( 
16100 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 29 7b  p->isResolved ){
16110 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 4f  .    assert( !pO
16120 75 74 65 72 4e 43 20 29 3b 0a 20 20 20 20 72 65  uterNC );.    re
16130 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16140 20 20 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c    }.  p->isResol
16150 76 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49  ved = 1;..  /* I
16160 66 20 74 68 65 72 65 20 68 61 76 65 20 61 6c 72  f there have alr
16170 65 61 64 79 20 62 65 65 6e 20 65 72 72 6f 72 73  eady been errors
16180 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f  , do nothing. */
16190 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
161a0 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  Err>0 ){.    ret
161b0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
161c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70  ;.  }..  /* Prep
161d0 61 72 65 20 74 68 65 20 73 65 6c 65 63 74 20 73  are the select s
161e0 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 63  tatement. This c
161f0 61 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74  all will allocat
16200 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20  e all cursors.  
16210 2a 2a 20 72 65 71 75 69 72 65 64 20 74 6f 20 68  ** required to h
16220 61 6e 64 6c 65 20 74 68 65 20 74 61 62 6c 65 73  andle the tables
16230 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
16240 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
16250 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  se..  */.  if( p
16260 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50  repSelectStmt(pP
16270 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
16280 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
16290 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ROR;.  }..  /* R
162a0 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65  esolve the expre
162b0 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49  ssions in the LI
162c0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
162d0 6c 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20  lauses. These.  
162e0 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  ** are not allow
162f0 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61  ed to refer to a
16300 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73  ny names, so pas
16310 73 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43  s an empty NameC
16320 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 6d  ontext..  */.  m
16330 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
16340 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73  izeof(sNC));.  s
16350 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
16360 73 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se;.  if( sqlite
16370 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
16380 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69  s(&sNC, p->pLimi
16390 74 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69  t) ||.      sqli
163a0 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
163b0 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66  mes(&sNC, p->pOf
163c0 66 73 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74  fset) ){.    ret
163d0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
163e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
163f0 75 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d  up the local nam
16400 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73  e-context to pas
16410 73 20 74 6f 20 45 78 70 72 52 65 73 6f 6c 76 65  s to ExprResolve
16420 4e 61 6d 65 73 28 29 20 74 6f 0a 20 20 2a 2a 20  Names() to.  ** 
16430 72 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72  resolve the expr
16440 65 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a  ession-list..  *
16450 2f 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67  /.  sNC.allowAgg
16460 20 3d 20 31 3b 0a 20 20 73 4e 43 2e 70 53 72 63   = 1;.  sNC.pSrc
16470 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
16480 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f    sNC.pNext = pO
16490 75 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20 52 65  uterNC;..  /* Re
164a0 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74  solve names in t
164b0 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a  he result set. *
164c0 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
164d0 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 21 70  pEList;.  if( !p
164e0 45 4c 69 73 74 20 29 20 72 65 74 75 72 6e 20 53  EList ) return S
164f0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 66  QLITE_ERROR;.  f
16500 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
16510 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
16520 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45     Expr *pX = pE
16530 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
16540 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
16550 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
16560 73 28 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20  s(&sNC, pX) ){. 
16570 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16580 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
16590 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
165a0 72 65 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67  re are no aggreg
165b0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ate functions in
165c0 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c   the result-set,
165d0 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59   and no GROUP BY
165e0 20 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f   .  ** expressio
165f0 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  n, do not allow 
16600 61 67 67 72 65 67 61 74 65 73 20 69 6e 20 61 6e  aggregates in an
16610 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 65  y of the other e
16620 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
16630 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69  .  assert( !p->i
16640 73 41 67 67 20 29 3b 0a 20 20 70 47 72 6f 75 70  sAgg );.  pGroup
16650 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
16660 3b 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79  ;.  if( pGroupBy
16670 20 7c 7c 20 73 4e 43 2e 68 61 73 41 67 67 20 29   || sNC.hasAgg )
16680 7b 0a 20 20 20 20 70 2d 3e 69 73 41 67 67 20 3d  {.    p->isAgg =
16690 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
166a0 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20   sNC.allowAgg = 
166b0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
166c0 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  a HAVING clause 
166d0 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  is present, then
166e0 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
166f0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
16700 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
16710 70 48 61 76 69 6e 67 20 26 26 20 21 70 47 72 6f  pHaving && !pGro
16720 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  upBy ){.    sqli
16730 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
16740 73 65 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20  se, "a GROUP BY 
16750 63 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72  clause is requir
16760 65 64 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47  ed before HAVING
16770 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ");.    return S
16780 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
16790 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65  ..  /* Add the e
167a0 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
167b0 6f 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65  o the name-conte
167c0 78 74 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e  xt before parsin
167d0 67 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  g the.  ** other
167e0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
167f0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
16800 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f  ment. This is so
16810 20 74 68 61 74 0a 20 20 2a 2a 20 65 78 70 72 65   that.  ** expre
16820 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48  ssions in the WH
16830 45 52 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e  ERE clause (etc.
16840 29 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65  ) can refer to e
16850 78 70 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20  xpressions by.  
16860 2a 2a 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68  ** aliases in th
16870 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20  e result set..  
16880 2a 2a 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f  **.  ** Minor po
16890 69 6e 74 3a 20 49 66 20 74 68 69 73 20 69 73 20  int: If this is 
168a0 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
168b0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  he expression wi
168c0 6c 6c 20 62 65 0a 20 20 2a 2a 20 72 65 2d 65 76  ll be.  ** re-ev
168d0 61 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63 68  aluated for each
168e0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74   reference to it
168f0 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c  ..  */.  sNC.pEL
16900 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
16910 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
16920 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
16930 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20  sNC, p->pWhere) 
16940 7c 7c 0a 20 20 20 20 20 73 71 6c 69 74 65 33 45  ||.     sqlite3E
16950 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
16960 26 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67  &sNC, p->pHaving
16970 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
16980 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
16990 7d 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  }.  if( p->pPrio
169a0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  r==0 ){.    if( 
169b0 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75  processOrderGrou
169c0 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  pBy(pParse, p, p
169d0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 31 2c 20 26  ->pOrderBy, 1, &
169e0 73 4e 43 2e 68 61 73 41 67 67 29 20 29 7b 0a 20  sNC.hasAgg) ){. 
169f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16a00 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
16a10 20 20 7d 0a 20 20 69 66 28 20 70 72 6f 63 65 73    }.  if( proces
16a20 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  sOrderGroupBy(pP
16a30 61 72 73 65 2c 20 70 2c 20 70 47 72 6f 75 70 42  arse, p, pGroupB
16a40 79 2c 20 30 2c 20 26 73 4e 43 2e 68 61 73 41 67  y, 0, &sNC.hasAg
16a50 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  g) ){.    return
16a60 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
16a70 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65   }..  if( pParse
16a80 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
16a90 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
16aa0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
16ab0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
16ac0 72 65 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  re the GROUP BY 
16ad0 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20  clause does not 
16ae0 63 6f 6e 74 61 69 6e 20 61 67 67 72 65 67 61 74  contain aggregat
16af0 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a  e functions..  *
16b00 2f 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79  /.  if( pGroupBy
16b10 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
16b20 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
16b30 74 65 6d 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28  tem;.  .    for(
16b40 69 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75  i=0, pItem=pGrou
16b50 70 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70  pBy->a; i<pGroup
16b60 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  By->nExpr; i++, 
16b70 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
16b80 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
16b90 72 74 79 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  rty(pItem->pExpr
16ba0 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20 20  , EP_Agg) ){.   
16bb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
16bc0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 67  rMsg(pParse, "ag
16bd0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
16be0 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  s are not allowe
16bf0 64 20 69 6e 20 22 0a 20 20 20 20 20 20 20 20 20  d in ".         
16c00 20 20 20 22 74 68 65 20 47 52 4f 55 50 20 42 59     "the GROUP BY
16c10 20 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 20   clause");.     
16c20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16c30 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
16c40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
16c50 49 66 20 74 68 69 73 20 69 73 20 6f 6e 65 20 53  If this is one S
16c60 45 4c 45 43 54 20 6f 66 20 61 20 63 6f 6d 70 6f  ELECT of a compo
16c70 75 6e 64 2c 20 62 65 20 73 75 72 65 20 74 6f 20  und, be sure to 
16c80 72 65 73 6f 6c 76 65 20 6e 61 6d 65 73 0a 20 20  resolve names.  
16c90 2a 2a 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  ** in the other 
16ca0 53 45 4c 45 43 54 73 2e 0a 20 20 2a 2f 0a 20 20  SELECTs..  */.  
16cb0 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
16cc0 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
16cd0 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65  te3SelectResolve
16ce0 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69  (pParse, p->pPri
16cf0 6f 72 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20  or, pOuterNC);. 
16d00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
16d10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16d20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  }.}../*.** Reset
16d30 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
16d40 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a  ccumulator..**.*
16d50 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20  * The aggregate 
16d60 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61  accumulator is a
16d70 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63   set of memory c
16d80 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a  ells that hold.*
16d90 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
16da0 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c  esults while cal
16db0 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72  culating an aggr
16dc0 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20  egate.  This.** 
16dd0 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20 73  routine simply s
16de0 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61  tores NULLs in a
16df0 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f  ll of those memo
16e00 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ry cells..*/.sta
16e10 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63  tic void resetAc
16e20 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
16e30 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
16e40 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
16e50 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
16e60 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
16e70 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
16e80 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20  o_func *pFunc;. 
16e90 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e   if( pAggInfo->n
16ea0 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e  Func+pAggInfo->n
16eb0 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20  Column==0 ){.   
16ec0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66   return;.  }.  f
16ed0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
16ee0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  fo->nColumn; i++
16ef0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
16f00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
16f10 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f  ull, 0, pAggInfo
16f20 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b  ->aCol[i].iMem);
16f30 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63  .  }.  for(pFunc
16f40 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
16f50 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  , i=0; i<pAggInf
16f60 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
16f70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Func++){.    sql
16f80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16f90 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46  , OP_Null, 0, pF
16fa0 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20  unc->iMem);.    
16fb0 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  if( pFunc->iDist
16fc0 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
16fd0 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e   Expr *pE = pFun
16fe0 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  c->pExpr;.      
16ff0 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d 3d 30  if( pE->pList==0
17000 20 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e   || pE->pList->n
17010 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
17020 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
17030 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54  sg(pParse, "DIST
17040 49 4e 43 54 20 69 6e 20 61 67 67 72 65 67 61 74  INCT in aggregat
17050 65 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77  e must be follow
17060 65 64 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ed ".           
17070 22 62 79 20 61 6e 20 65 78 70 72 65 73 73 69 6f  "by an expressio
17080 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75  n");.        pFu
17090 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  nc->iDistinct = 
170a0 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
170b0 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
170c0 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79   *pKeyInfo = key
170d0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
170e0 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69  (pParse, pE->pLi
170f0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  st);.        sql
17100 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
17110 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
17120 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  al, pFunc->iDist
17130 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  inct, 0, 0,.    
17140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17150 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
17160 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
17170 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20  O_HANDOFF);.    
17180 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
17190 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
171a0 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65  e OP_AggFinalize
171b0 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72   opcode for ever
171c0 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  y aggregate func
171d0 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41  tion.** in the A
171e0 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
171f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
17200 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
17210 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61  tions(Parse *pPa
17220 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
17230 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
17240 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
17250 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
17260 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
17270 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d  nc *pF;.  for(i=
17280 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
17290 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
172a0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
172b0 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  F++){.    ExprLi
172c0 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
172d0 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
172e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
172f0 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e  Op4(v, OP_AggFin
17300 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c  al, pF->iMem, pL
17310 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
17320 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20  pr : 0, 0,.     
17330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17340 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
17350 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
17360 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64    }.}../*.** Upd
17370 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ate the accumula
17380 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  tor memory cells
17390 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
173a0 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  e based on.** th
173b0 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
173c0 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
173d0 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65  atic void update
173e0 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
173f0 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
17400 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
17410 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
17420 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
17430 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
17440 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
17450 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
17460 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49  ol *pC;..  pAggI
17470 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
17480 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  = 1;.  for(i=0, 
17490 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  pF=pAggInfo->aFu
174a0 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  nc; i<pAggInfo->
174b0 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b  nFunc; i++, pF++
174c0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  ){.    int nArg;
174d0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78  .    int addrNex
174e0 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
174f0 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c  egAgg;.    ExprL
17500 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
17510 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20  >pExpr->pList;. 
17520 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
17530 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69        nArg = pLi
17540 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
17550 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65   regAgg = sqlite
17560 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
17570 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20  arse, nArg);.   
17580 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
17590 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
175a0 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67  e, pList, regAgg
175b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
175c0 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20      nArg = 0;.  
175d0 20 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a      regAgg = 0;.
175e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
175f0 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
17600 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74  {.      addrNext
17610 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
17620 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
17630 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
17640 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44  1 );.      codeD
17650 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
17660 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61  pF->iDistinct, a
17670 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41  ddrNext, 1, regA
17680 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gg);.    }.    i
17690 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65  f( pF->pFunc->ne
176a0 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20  edCollSeq ){.   
176b0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
176c0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72  l = 0;.      str
176d0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
176e0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
176f0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73  int j;.      ass
17700 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
17710 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66    /* pList!=0 if
17720 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64   pF->pFunc->need
17730 43 6f 6c 6c 53 65 71 20 69 73 20 74 72 75 65 20  CollSeq is true 
17740 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  */.      for(j=0
17750 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
17760 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41  ; !pColl && j<nA
17770 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rg; j++, pItem++
17780 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
17790 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
177a0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
177b0 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
177c0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
177d0 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
177e0 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d   pColl = pParse-
177f0 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a  >db->pDfltColl;.
17800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
17810 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
17820 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
17830 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
17840 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
17850 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  Q);.    }.    sq
17860 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
17870 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30  v, OP_AggStep, 0
17880 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d  , regAgg, pF->iM
17890 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  em,.            
178a0 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
178b0 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  )pF->pFunc, P4_F
178c0 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c  UNCDEF);.    sql
178d0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
178e0 28 76 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73  (v, nArg);.    s
178f0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
17900 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
17910 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20  egAgg, nArg);.  
17920 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29    if( addrNext )
17930 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
17940 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
17950 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20  v, addrNext);.  
17960 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
17970 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pC=pAggInfo->
17980 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f  aCol; i<pAggInfo
17990 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20  ->nAccumulator; 
179a0 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20  i++, pC++){.    
179b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
179c0 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70  pParse, pC->pExp
179d0 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20  r, pC->iMem);.  
179e0 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  }.  pAggInfo->di
179f0 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 7d 0a  rectMode = 0;.}.
17a00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17a10 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 2f 2a 0a  OMIT_TRIGGER./*.
17a20 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17a30 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 61 20   is used when a 
17a40 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
17a50 20 69 73 20 75 73 65 64 20 74 6f 20 63 72 65 61   is used to crea
17a60 74 65 20 61 0a 2a 2a 20 74 65 6d 70 6f 72 61 72  te a.** temporar
17a70 79 20 74 61 62 6c 65 20 66 6f 72 20 69 74 65 72  y table for iter
17a80 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 77 68  ating through wh
17a90 65 6e 20 72 75 6e 6e 69 6e 67 20 61 6e 20 49 4e  en running an IN
17aa0 53 54 45 41 44 20 4f 46 0a 2a 2a 20 55 50 44 41  STEAD OF.** UPDA
17ab0 54 45 20 6f 72 20 49 4e 53 54 45 41 44 20 4f 46  TE or INSTEAD OF
17ac0 20 44 45 4c 45 54 45 20 74 72 69 67 67 65 72 2e   DELETE trigger.
17ad0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69   .**.** If possi
17ae0 62 6c 65 2c 20 74 68 65 20 53 45 4c 45 43 54 20  ble, the SELECT 
17af0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6d 6f 64  statement is mod
17b00 69 66 69 65 64 20 73 6f 20 74 68 61 74 20 4e 55  ified so that NU
17b10 4c 4c 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65  LL values.** are
17b20 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 74   stored in the t
17b30 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 66  emporary table f
17b40 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66  or all columns f
17b50 6f 72 20 77 68 69 63 68 20 74 68 65 20 0a 2a 2a  or which the .**
17b60 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
17b70 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d  it in argument m
17b80 61 73 6b 20 69 73 20 6e 6f 74 20 73 65 74 2e 20  ask is not set. 
17b90 49 66 20 6d 61 73 6b 20 74 61 6b 65 73 20 74 68  If mask takes th
17ba0 65 0a 2a 2a 20 73 70 65 63 69 61 6c 20 76 61 6c  e.** special val
17bb0 75 65 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  ue 0xffffffff, t
17bc0 68 65 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  hen all columns 
17bd0 61 72 65 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a  are populated..*
17be0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
17bf0 6c 65 63 74 4d 61 73 6b 28 50 61 72 73 65 20 2a  lectMask(Parse *
17c00 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
17c10 70 2c 20 75 33 32 20 6d 61 73 6b 29 7b 0a 20 20  p, u32 mask){.  
17c20 69 66 28 20 70 20 26 26 20 21 70 2d 3e 70 50 72  if( p && !p->pPr
17c30 69 6f 72 20 26 26 20 21 70 2d 3e 69 73 44 69 73  ior && !p->isDis
17c40 74 69 6e 63 74 20 26 26 20 6d 61 73 6b 21 3d 30  tinct && mask!=0
17c50 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
17c60 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
17c70 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
17c80 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52    sqlite3SelectR
17c90 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70  esolve(pParse, p
17ca0 2c 20 30 29 3b 0a 20 20 20 20 70 45 4c 69 73 74  , 0);.    pEList
17cb0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
17cc0 20 20 66 6f 72 28 69 3d 30 3b 20 70 45 4c 69 73    for(i=0; pELis
17cd0 74 20 26 26 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  t && i<pEList->n
17ce0 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b  Expr && i<32; i+
17cf0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 28  +){.      if( !(
17d00 6d 61 73 6b 26 28 28 75 33 32 29 31 3c 3c 69 29  mask&((u32)1<<i)
17d10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
17d20 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
17d30 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
17d40 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45 4c 69  r);.        pELi
17d50 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  st->a[i].pExpr =
17d60 20 73 71 6c 69 74 65 33 45 78 70 72 28 70 50 61   sqlite3Expr(pPa
17d70 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 4e 55 4c 4c  rse->db, TK_NULL
17d80 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
17d90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
17da0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
17db0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
17dc0 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54  the given SELECT
17dd0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
17de0 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
17df0 65 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e  e distributed in
17e00 20 76 61 72 69 6f 75 73 20 77 61 79 73 20 64 65   various ways de
17e10 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a  pending on the.*
17e20 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
17e30 65 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72  e SelectDest str
17e40 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
17e50 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20 70 44  o by argument pD
17e60 65 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77  est.** as follow
17e70 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65  s:.**.**     pDe
17e80 73 74 2d 3e 65 44 65 73 74 20 20 20 20 52 65 73  st->eDest    Res
17e90 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d  ult.**     -----
17ea0 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
17eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17ed0 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52  ------.**     SR
17ee0 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e  T_Callback    In
17ef0 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63  voke the callbac
17f00 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  k for each row o
17f10 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  f the result..**
17f20 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20  .**     SRT_Mem 
17f30 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69          Store fi
17f40 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65  rst result in me
17f50 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d  mory cell pDest-
17f60 3e 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  >iParm.**.**    
17f70 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20   SRT_Set        
17f80 20 53 74 6f 72 65 20 6e 6f 6e 2d 6e 75 6c 6c 20   Store non-null 
17f90 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20  results as keys 
17fa0 6f 66 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  of table pDest->
17fb0 69 50 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20 20  iParm. .**      
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
17fd0 70 70 6c 79 20 74 68 65 20 61 66 66 69 6e 69 74  pply the affinit
17fe0 79 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74  y pDest->affinit
17ff0 79 20 62 65 66 6f 72 65 20 73 74 6f 72 69 6e 67  y before storing
18000 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   them..**.**    
18010 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20   SRT_Union      
18020 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61   Store results a
18030 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d  s a key in a tem
18040 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65  porary table pDe
18050 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  st->iParm..**.**
18060 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20       SRT_Except 
18070 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75       Remove resu
18080 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d  lts from the tem
18090 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65  porary table pDe
180a0 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  st->iParm..**.**
180b0 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20       SRT_Table  
180c0 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
180d0 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  ts in temporary 
180e0 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61  table pDest->iPa
180f0 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  rm.**.**     SRT
18100 5f 45 70 68 65 6d 54 61 62 20 20 20 20 43 72 65  _EphemTab    Cre
18110 61 74 65 20 61 6e 20 74 65 6d 70 6f 72 61 72 79  ate an temporary
18120 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50   table pDest->iP
18130 61 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a  arm and store.**
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18150 20 20 20 20 20 74 68 65 20 72 65 73 75 6c 74 20       the result 
18160 74 68 65 72 65 2e 20 54 68 65 20 63 75 72 73 6f  there. The curso
18170 72 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20 61  r is left open a
18180 66 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  fter.**         
18190 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
181a0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  rning..**.**    
181b0 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20   SRT_Subroutine 
181c0 20 46 6f 72 20 65 61 63 68 20 72 6f 77 20 72 65   For each row re
181d0 74 75 72 6e 65 64 2c 20 70 75 73 68 20 74 68 65  turned, push the
181e0 20 72 65 73 75 6c 74 73 20 6f 6e 74 6f 20 74 68   results onto th
181f0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
18200 20 20 20 20 20 20 20 20 20 76 64 62 65 20 73 74           vdbe st
18210 61 63 6b 20 61 6e 64 20 63 61 6c 6c 20 74 68 65  ack and call the
18220 20 73 75 62 72 6f 75 74 69 6e 65 20 28 76 69 61   subroutine (via
18230 20 4f 50 5f 47 6f 73 75 62 29 0a 2a 2a 20 20 20   OP_Gosub).**   
18240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18250 20 20 61 74 20 61 64 64 72 65 73 73 20 70 44 65    at address pDe
18260 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  st->iParm..**.**
18270 20 20 20 20 20 53 52 54 5f 45 78 69 73 74 73 20       SRT_Exists 
18280 20 20 20 20 20 53 74 6f 72 65 20 61 20 31 20 69       Store a 1 i
18290 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70 44  n memory cell pD
182a0 65 73 74 2d 3e 69 50 61 72 6d 20 69 66 20 74 68  est->iParm if th
182b0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20  e result.**     
182c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182d0 73 65 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  set is not empty
182e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
182f0 44 69 73 63 61 72 64 20 20 20 20 20 54 68 72 6f  Discard     Thro
18300 77 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 77  w the results aw
18310 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68  ay..**.** See th
18320 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  e selectInnerLoo
18330 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  p() function for
18340 20 61 20 63 61 6e 6f 6e 69 63 61 6c 20 6c 69 73   a canonical lis
18350 74 69 6e 67 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ting of the .** 
18360 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f  allowed values o
18370 66 20 65 44 65 73 74 20 61 6e 64 20 74 68 65 69  f eDest and thei
18380 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a  r meanings..**.*
18390 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
183a0 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
183b0 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
183c0 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a   any errors are.
183d0 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
183e0 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  then an appropri
183f0 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
18400 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20  e is left in.** 
18410 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
18420 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18430 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65  ine does NOT fre
18440 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  e the Select str
18450 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e  ucture passed in
18460 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
18470 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  g function needs
18480 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a   to do that..**.
18490 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20  ** The pParent, 
184a0 70 61 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a  parentTab, and *
184b0 70 50 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64  pParentAgg field
184c0 73 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20  s are filled in 
184d0 69 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43  if this.** SELEC
184e0 54 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2e  T is a subquery.
184f0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
18500 61 79 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e  ay try to combin
18510 65 20 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a  e this SELECT.**
18520 20 77 69 74 68 20 69 74 73 20 70 61 72 65 6e 74   with its parent
18530 20 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c   to form a singl
18540 65 20 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49  e flat query.  I
18550 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d  n so doing, it m
18560 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74  ight.** change t
18570 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
18580 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65  from a non-aggre
18590 67 61 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65  gate to an aggre
185a0 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46  gate query..** F
185b0 6f 72 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20  or that reason, 
185c0 74 68 65 20 70 50 61 72 65 6e 74 41 67 67 20 66  the pParentAgg f
185d0 6c 61 67 20 69 73 20 70 61 73 73 65 64 20 61 73  lag is passed as
185e0 20 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69   a pointer, so i
185f0 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e  t.** can be chan
18600 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  ged..**.** Examp
18610 6c 65 20 31 3a 20 20 20 54 68 65 20 6d 65 61 6e  le 1:   The mean
18620 69 6e 67 20 6f 66 20 74 68 65 20 70 50 61 72 65  ing of the pPare
18630 6e 74 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  nt parameter..**
18640 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
18650 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45  FROM t1 JOIN (SE
18660 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29  LECT x, count(*)
18670 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74   FROM t2) JOIN t
18680 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20 20  3;.**    \      
18690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186a0 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  \_______ subquer
186b0 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  y _______/      
186c0 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20 20 20    /.**     \    
186d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18700 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f    /.**      \___
18710 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18720 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f  _ outer query __
18730 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18740 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  _/.**.** This ro
18750 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
18760 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75  for the outer qu
18770 65 72 79 20 66 69 72 73 74 2e 20 20 20 46 6f 72  ery first.   For
18780 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70   that call,.** p
18790 50 61 72 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e  Parent will be N
187a0 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74 68 65  ULL.  During the
187b0 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74   processing of t
187c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2c 20  he outer query, 
187d0 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65  this .** routine
187e0 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72   is called recur
187f0 73 69 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65  sively to handle
18800 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
18810 46 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76  For the recursiv
18820 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65  e.** call, pPare
18830 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f  nt will point to
18840 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
18850 2e 20 20 42 65 63 61 75 73 65 20 74 68 65 20 73  .  Because the s
18860 75 62 71 75 65 72 79 20 69 73 0a 2a 2a 20 74 68  ubquery is.** th
18870 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74  e second element
18880 20 69 6e 20 61 20 74 68 72 65 65 2d 77 61 79 20   in a three-way 
18890 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72 65 6e 74  join, the parent
188a0 54 61 62 20 70 61 72 61 6d 65 74 65 72 20 77 69  Tab parameter wi
188b0 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68 65 20  ll.** be 1 (the 
188c0 32 6e 64 20 76 61 6c 75 65 20 6f 66 20 61 20 30  2nd value of a 0
188d0 2d 69 6e 64 65 78 65 64 20 61 72 72 61 79 2e 29  -indexed array.)
188e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
188f0 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
18900 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
18910 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
18920 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
18930 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
18940 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
18950 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
18960 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65  coded. */.  Sele
18970 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
18980 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
18990 20 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20   with the query 
189a0 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 53 65 6c  results */.  Sel
189b0 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  ect *pParent,   
189c0 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
189d0 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68 20  ELECT for which 
189e0 74 68 69 73 20 69 73 20 61 20 73 75 62 2d 71 75  this is a sub-qu
189f0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72  ery */.  int par
18a00 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20 20  entTab,         
18a10 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61 72  /* Index in pPar
18a20 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68 69  ent->pSrc of thi
18a30 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  s query */.  int
18a40 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 20 20   *pParentAgg,   
18a50 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
18a60 50 61 72 65 6e 74 20 75 73 65 73 20 61 67 67 72  Parent uses aggr
18a70 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
18a80 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20  */.  char *aff  
18a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
18aa0 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55  f eDest is SRT_U
18ab0 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69  nion, the affini
18ac0 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ty string */.){.
18ad0 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
18ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
18af0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
18b00 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
18b10 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ;     /* Return 
18b20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72  from sqlite3Wher
18b30 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64  eBegin() */.  Vd
18b40 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
18b50 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
18b60 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65  ual machine unde
18b70 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
18b80 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20  /.  int isAgg;  
18b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
18ba0 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69  ue for select li
18bb0 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  sts like "count(
18bc0 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  *)" */.  ExprLis
18bd0 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
18be0 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
18bf0 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a  ns to extract. *
18c00 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
18c10 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69  bList;     /* Li
18c20 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
18c30 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
18c40 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
18c50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
18c60 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
18c70 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
18c80 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
18c90 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  y;    /* The ORD
18ca0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  ER BY clause.  M
18cb0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
18cc0 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
18cd0 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52  By;    /* The GR
18ce0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
18cf0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
18d00 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20   Expr *pHaving; 
18d10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48          /* The H
18d20 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d  AVING clause.  M
18d30 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
18d40 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20  int isDistinct; 
18d50 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
18d60 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
18d70 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
18d80 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69  t */.  int disti
18d90 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nct;          /*
18da0 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f   Table to use fo
18db0 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
18dc0 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  et */.  int rc =
18dd0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
18de0 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
18df0 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
18e00 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
18e10 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
18e20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
18e30 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  n OP_OpenEphemer
18e40 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a  al instruction *
18e50 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67  /.  AggInfo sAgg
18e60 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e  Info;      /* In
18e70 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62  formation used b
18e80 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  y aggregate quer
18e90 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e  ies */.  int iEn
18ea0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
18eb0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18ec0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65  e end of the que
18ed0 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ry */.  sqlite3 
18ee0 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *db;           /
18ef0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
18f00 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
18f10 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
18f20 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64  .  if( p==0 || d
18f30 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18f40 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
18f50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
18f60 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
18f70 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
18f80 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
18f90 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
18fa0 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74  turn 1;.  memset
18fb0 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73  (&sAggInfo, 0, s
18fc0 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29  izeof(sAggInfo))
18fd0 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  ;..  pOrderBy = 
18fe0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
18ff0 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
19000 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
19010 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
19020 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68  0;..    /* In th
19030 65 73 65 20 63 61 73 65 73 20 74 68 65 20 44 49  ese cases the DI
19040 53 54 49 4e 43 54 20 6f 70 65 72 61 74 6f 72 20  STINCT operator 
19050 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65  makes no differe
19060 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  nce to the.    *
19070 2a 20 72 65 73 75 6c 74 73 2c 20 73 6f 20 72 65  * results, so re
19080 6d 6f 76 65 20 69 74 20 69 66 20 69 74 20 77 65  move it if it we
19090 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20  re specified..  
190a0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
190b0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
190c0 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73  T_Exists || pDes
190d0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e  t->eDest==SRT_Un
190e0 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ion || .        
190f0 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
19100 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70  =SRT_Except || p
19110 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
19120 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20 70  _Discard);.    p
19130 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30  ->isDistinct = 0
19140 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
19150 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65  te3SelectResolve
19160 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 20 29  (pParse, p, 0) )
19170 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
19180 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e  t_end;.  }.  p->
19190 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
191a0 72 42 79 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  rBy;..#ifndef SQ
191b0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
191c0 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49  ND_SELECT.  /* I
191d0 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61  f there is are a
191e0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65   sequence of que
191f0 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72  ries, do the ear
19200 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e  lier ones first.
19210 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
19220 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
19230 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d   p->pRightmost==
19240 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63  0 ){.      Selec
19250 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69 67 68  t *pLoop, *pRigh
19260 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
19270 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20   cnt = 0;.      
19280 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f  for(pLoop=p; pLo
19290 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
192a0 3e 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b  >pPrior, cnt++){
192b0 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
192c0 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a  pRightmost = p;.
192d0 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70          pLoop->p
192e0 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  Next = pRight;. 
192f0 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
19300 70 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  pLoop;.      }. 
19310 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
19320 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
19330 45 43 54 3e 30 20 26 26 20 63 6e 74 3e 53 51 4c  ECT>0 && cnt>SQL
19340 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
19350 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
19360 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
19370 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
19380 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f  many terms in co
19390 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b  mpound SELECT");
193a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
193b0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
193c0 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
193d0 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
193e0 70 2c 20 70 44 65 73 74 2c 20 61 66 66 29 3b 0a  p, pDest, aff);.
193f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
19400 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69   Make local copi
19410 65 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65  es of the parame
19420 74 65 72 73 20 66 6f 72 20 74 68 69 73 20 71 75  ters for this qu
19430 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62  ery..  */.  pTab
19440 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
19450 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
19460 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79  here;.  pGroupBy
19470 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
19480 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
19490 48 61 76 69 6e 67 3b 0a 20 20 69 73 41 67 67 20  Having;.  isAgg 
194a0 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 69 73  = p->isAgg;.  is
194b0 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
194c0 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 45 4c 69  Distinct;.  pELi
194d0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
194e0 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
194f0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
19500 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44  d;..  /* .  ** D
19510 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d  o not even attem
19520 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  pt to generate a
19530 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61  ny code if we ha
19540 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a  ve already seen.
19550 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f    ** errors befo
19560 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
19570 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69  starts..  */.  i
19580 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  f( pParse->nErr>
19590 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
195a0 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72  end;..  /* If wr
195b0 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20  iting to memory 
195c0 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  or generating a 
195d0 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20  set.  ** only a 
195e0 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61  single column ma
195f0 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  y be output..  *
19600 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
19610 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
19620 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c   if( checkForMul
19630 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
19640 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73  ror(pParse, pDes
19650 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
19660 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  ) ){.    goto se
19670 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
19680 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52  ndif..  /* ORDER
19690 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66   BY is ignored f
196a0 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74  or some destinat
196b0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
196c0 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62   IgnorableOrderb
196d0 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
196e0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
196f0 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  }..  /* Begin ge
19700 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
19710 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
19720 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
19730 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
19740 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
19750 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
19760 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
19770 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
19780 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
19790 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
197a0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
197b0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
197c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
197d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
197e0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
197f0 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
19800 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
19810 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69  ntext = 0;.    i
19820 6e 74 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f  nt needRestoreCo
19830 6e 74 65 78 74 3b 0a 20 20 20 20 73 74 72 75 63  ntext;.    struc
19840 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
19850 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
19860 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c  t->a[i];.    Sel
19870 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 0a 20  ectDest dest;.. 
19880 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
19890 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 49 74 65  elect==0 || pIte
198a0 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 29  m->isPopulated )
198b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
198c0 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21  f( pItem->zName!
198d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76  =0 ){.      zSav
198e0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
198f0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
19900 74 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72  text;.      pPar
19910 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
19920 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b   = pItem->zName;
19930 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f  .      needResto
19940 72 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20  reContext = 1;. 
19950 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19960 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
19970 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 69  xt = 0;.    }.#i
19980 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
19990 5f 54 45 53 54 29 20 7c 7c 20 53 51 4c 49 54 45  _TEST) || SQLITE
199a0 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
199b0 30 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  0.    /* Increme
199c0 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74  nt Parse.nHeight
199d0 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f   by the height o
199e0 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78  f the largest ex
199f0 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
19a00 74 72 65 65 20 72 65 66 65 72 65 64 20 74 6f 20  tree refered to 
19a10 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72  by this, the par
19a20 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20  ent select. The 
19a30 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20  child select.   
19a40 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   ** may contain 
19a50 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
19a60 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20   of at most.    
19a70 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ** (SQLITE_MAX_E
19a80 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e  XPR_DEPTH-Parse.
19a90 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e  nHeight) height.
19aa0 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20   This is a bit. 
19ab0 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65     ** more conse
19ac0 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rvative than nec
19ad0 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68  essary, but much
19ae0 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66   easier than enf
19af0 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  orcing.    ** an
19b00 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20   exact limit..  
19b10 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
19b20 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69  >nHeight += sqli
19b30 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
19b40 67 68 74 28 70 29 3b 0a 23 65 6e 64 69 66 0a 20  ght(p);.#endif. 
19b50 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
19b60 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
19b70 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49  SRT_EphemTab, pI
19b80 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
19b90 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
19ba0 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
19bb0 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 2c 20  pSelect, &dest, 
19bc0 70 2c 20 69 2c 20 26 69 73 41 67 67 2c 20 30 29  p, i, &isAgg, 0)
19bd0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
19be0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
19bf0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
19c00 65 6e 64 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64  end;.    }.#if d
19c10 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
19c20 53 54 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  ST) || SQLITE_MA
19c30 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20  X_EXPR_DEPTH>0. 
19c40 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
19c50 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht -= sqlite3Sel
19c60 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
19c70 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
19c80 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
19c90 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ext ){.      pPa
19ca0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
19cb0 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
19cc0 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ntext;.    }.   
19cd0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
19ce0 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65 20  Src;.    pWhere 
19cf0 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  = p->pWhere;.   
19d00 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f   if( !IgnorableO
19d10 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
19d20 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
19d30 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
19d40 20 20 20 7d 0a 20 20 20 20 70 47 72 6f 75 70 42     }.    pGroupB
19d50 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
19d60 0a 20 20 20 20 70 48 61 76 69 6e 67 20 3d 20 70  .    pHaving = p
19d70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 69  ->pHaving;.    i
19d80 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
19d90 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 23  sDistinct;.  }.#
19da0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63  endif..  /* Chec
19db0 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 61  k for the specia
19dc0 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e 28  l case of a min(
19dd0 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74  ) or max() funct
19de0 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20 20  ion by itself.  
19df0 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
19e00 20 73 65 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 30   set..  */.#if 0
19e10 0a 20 20 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e  .  if( simpleMin
19e20 4d 61 78 51 75 65 72 79 28 70 50 61 72 73 65 2c  MaxQuery(pParse,
19e30 20 70 2c 20 70 44 65 73 74 29 20 29 7b 0a 20 20   p, pDest) ){.  
19e40 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f    rc = 0;.    go
19e50 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
19e60 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
19e70 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
19e80 74 68 69 73 20 69 73 20 61 20 73 75 62 71 75 65  this is a subque
19e90 72 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 22  ry that can be "
19ea0 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20  flattened" into 
19eb0 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a  its parent..  **
19ec0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
19ed0 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20  s a possiblity, 
19ee0 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e  do so and return
19ef0 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a   immediately.  .
19f00 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
19f10 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
19f20 69 66 28 20 70 50 61 72 65 6e 74 20 26 26 20 70  if( pParent && p
19f30 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20  ParentAgg &&.   
19f40 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65     flattenSubque
19f50 72 79 28 64 62 2c 20 70 50 61 72 65 6e 74 2c 20  ry(db, pParent, 
19f60 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72  parentTab, *pPar
19f70 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20 29  entAgg, isAgg) )
19f80 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  {.    if( isAgg 
19f90 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20  ) *pParentAgg = 
19fa0 31 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  1;.    goto sele
19fb0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
19fc0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 6f 73 73  if..  /* If poss
19fd0 69 62 6c 65 2c 20 72 65 77 72 69 74 65 20 74 68  ible, rewrite th
19fe0 65 20 71 75 65 72 79 20 74 6f 20 75 73 65 20 47  e query to use G
19ff0 52 4f 55 50 20 42 59 20 69 6e 73 74 65 61 64 20  ROUP BY instead 
1a000 6f 66 20 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a  of DISTINCT..  *
1a010 2a 20 47 52 4f 55 50 20 42 59 20 6d 61 79 20 75  * GROUP BY may u
1a020 73 65 20 61 6e 20 69 6e 64 65 78 2c 20 44 49 53  se an index, DIS
1a030 54 49 4e 43 54 20 6e 65 76 65 72 20 64 6f 65 73  TINCT never does
1a040 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
1a050 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 21 70  isDistinct && !p
1a060 2d 3e 69 73 41 67 67 20 26 26 20 21 70 2d 3e 70  ->isAgg && !p->p
1a070 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 70  GroupBy ){.    p
1a080 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
1a090 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
1a0a0 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  db, p->pEList);.
1a0b0 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
1a0c0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
1a0d0 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20  p->isDistinct = 
1a0e0 30 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63  0;.    isDistinc
1a0f0 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t = 0;.  }..  /*
1a100 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
1a110 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
1a120 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69   then this sorti
1a130 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69  ng.  ** index mi
1a140 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ght end up being
1a150 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64   unused if the d
1a160 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a  ata can be .  **
1a170 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72   extracted in pr
1a180 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20  e-sorted order. 
1a190 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
1a1a0 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  case, then the. 
1a1b0 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   ** OP_OpenEphem
1a1c0 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
1a1d0 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
1a1e0 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f   to an OP_Noop o
1a1f0 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75  nce.  ** we figu
1a200 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  re out that the 
1a210 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73  sorting index is
1a220 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68   not needed.  Th
1a230 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a  e addrSortIndex.
1a240 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73    ** variable is
1a250 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74   used to facilit
1a260 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e  ate that change.
1a270 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
1a280 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
1a290 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
1a2a0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
1a2b0 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
1a2c0 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  t(pParse, pOrder
1a2d0 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42  By);.    pOrderB
1a2e0 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50  y->iECursor = pP
1a2f0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
1a300 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
1a310 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49  m[2] = addrSortI
1a320 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c  ndex =.      sql
1a330 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1a340 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
1a350 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1a370 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
1a380 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  r, pOrderBy->nEx
1a390 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20  pr+2, 0,.       
1a3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3b0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
1a3c0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
1a3d0 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73  HANDOFF);.  }els
1a3e0 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49  e{.    addrSortI
1a3f0 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  ndex = -1;.  }..
1a400 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
1a410 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
1a420 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
1a430 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
1a440 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
1a450 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
1a460 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
1a470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a480 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
1a490 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74  Ephemeral, pDest
1a4a0 2d 3e 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  ->iParm, pEList-
1a4b0 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
1a4c0 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
1a4d0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20  er..  */.  iEnd 
1a4e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1a4f0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d  eLabel(v);.  com
1a500 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
1a510 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45  rs(pParse, p, iE
1a520 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  nd);..  /* Open 
1a530 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
1a540 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
1a550 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
1a560 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e  /.  if( isDistin
1a570 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  ct ){.    KeyInf
1a580 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
1a590 20 61 73 73 65 72 74 28 20 69 73 41 67 67 20 7c   assert( isAgg |
1a5a0 7c 20 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20  | pGroupBy );.  
1a5b0 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61    distinct = pPa
1a5c0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
1a5d0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
1a5e0 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
1a5f0 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
1a600 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
1a610 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1a620 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64  OpenEphemeral, d
1a630 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  istinct, 0, 0,. 
1a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a650 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
1a660 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
1a670 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d  FO_HANDOFF);.  }
1a680 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e  else{.    distin
1a690 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ct = -1;.  }..  
1a6a0 2f 2a 20 41 67 67 72 65 67 61 74 65 20 61 6e 64  /* Aggregate and
1a6b0 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71   non-aggregate q
1a6c0 75 65 72 69 65 73 20 61 72 65 20 68 61 6e 64 6c  ueries are handl
1a6d0 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 2a  ed differently *
1a6e0 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26  /.  if( !isAgg &
1a6f0 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  & pGroupBy==0 ){
1a700 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73  .    /* This cas
1a710 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67 67  e is for non-agg
1a720 72 65 67 61 74 65 20 71 75 65 72 69 65 73 0a 20  regate queries. 
1a730 20 20 20 2a 2a 20 42 65 67 69 6e 20 74 68 65 20     ** Begin the 
1a740 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20  database scan.  
1a750 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20    */.    pWInfo 
1a760 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
1a770 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
1a780 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70  List, pWhere, &p
1a790 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20  OrderBy, 0);.   
1a7a0 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
1a7b0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1a7c0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72  ;..    /* If sor
1a7d0 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
1a7e0 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
1a7f0 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70   prior OP_OpenEp
1a800 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20  hemeral .    ** 
1a810 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65  instruction ende
1a820 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e  d up not being n
1a830 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e  eeded, then chan
1a840 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
1a850 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69  hemeral.    ** i
1a860 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a  nto an OP_Noop..
1a870 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61      */.    if( a
1a880 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20  ddrSortIndex>=0 
1a890 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  && pOrderBy==0 )
1a8a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1a8b0 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
1a8c0 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  v, addrSortIndex
1a8d0 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  , 1);.      p->a
1a8e0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
1a8f0 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
1a900 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64  /* Use the stand
1a910 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20  ard inner loop. 
1a920 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1a930 28 21 69 73 44 69 73 74 69 6e 63 74 29 3b 0a 20  (!isDistinct);. 
1a940 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
1a950 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  op(pParse, p, pE
1a960 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64  List, 0, 0, pOrd
1a970 65 72 42 79 2c 20 2d 31 2c 20 70 44 65 73 74 2c  erBy, -1, pDest,
1a980 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a990 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f       pWInfo->iCo
1a9a0 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e  ntinue, pWInfo->
1a9b0 69 42 72 65 61 6b 2c 20 61 66 66 29 3b 0a 0a 20  iBreak, aff);.. 
1a9c0 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61     /* End the da
1a9d0 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70  tabase scan loop
1a9e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
1a9f0 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
1aa00 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nfo);.  }else{. 
1aa10 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
1aa20 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  e processing for
1aa30 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
1aa40 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f  es */.    NameCo
1aa50 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a  ntext sNC;    /*
1aa60 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
1aa70 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67  r processing agg
1aa80 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69  regate informati
1aa90 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  on */.    int iA
1aaa0 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
1aab0 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
1aac0 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63  ss for storing c
1aad0 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
1aae0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d  */.    int iBMem
1aaf0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
1ab00 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
1ab10 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f  for previous GRO
1ab20 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
1ab30 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20   iUseFlag;      
1ab40 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
1ab50 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64  holding flag ind
1ab60 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20  icating that at 
1ab70 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20  least.          
1ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1ab90 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
1aba0 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67  input to the agg
1abb0 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e  regator has been
1abc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1abd0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
1abe0 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  essed */.    int
1abf0 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20   iAbortFlag;    
1ac00 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
1ac10 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65  which causes que
1ac20 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69  ry abort if posi
1ac30 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tive */.    int 
1ac40 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20  groupBySort;    
1ac50 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f  /* Rows come fro
1ac60 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55  m source in GROU
1ac70 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 0a 0a  P BY order */...
1ac80 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
1ac90 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 20 68  wing variables h
1aca0 6f 6c 64 20 61 64 64 72 65 73 73 65 73 20 6f 72  old addresses or
1acb0 20 6c 61 62 65 6c 73 20 66 6f 72 20 70 61 72 74   labels for part
1acc0 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
1acd0 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
1ace0 70 72 6f 67 72 61 6d 20 77 65 20 61 72 65 20 70  program we are p
1acf0 75 74 74 69 6e 67 20 74 6f 67 65 74 68 65 72 20  utting together 
1ad00 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4f  */.    int addrO
1ad10 75 74 70 75 74 52 6f 77 3b 20 20 20 20 20 20 2f  utputRow;      /
1ad20 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f  * Start of subro
1ad30 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
1ad40 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20  ts a result row 
1ad50 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53  */.    int addrS
1ad60 65 74 41 62 6f 72 74 3b 20 20 20 20 20 20 20 2f  etAbort;       /
1ad70 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20  * Set the abort 
1ad80 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20  flag and return 
1ad90 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 49  */.    int addrI
1ada0 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 3b 20 2f  nitializeLoop; /
1adb0 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 64 65 20  * Start of code 
1adc0 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73  that initializes
1add0 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20   the input loop 
1ade0 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 54  */.    int addrT
1adf0 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20 20 20 20 2f  opOfLoop;      /
1ae00 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70  * Top of the inp
1ae10 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  ut loop */.    i
1ae20 6e 74 20 61 64 64 72 47 72 6f 75 70 42 79 43 68  nt addrGroupByCh
1ae30 61 6e 67 65 3b 20 20 2f 2a 20 43 6f 64 65 20 74  ange;  /* Code t
1ae40 68 61 74 20 72 75 6e 73 20 77 68 65 6e 20 61 6e  hat runs when an
1ae50 79 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 20  y GROUP BY term 
1ae60 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20 20 69  changes */.    i
1ae70 6e 74 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f  nt addrProcessRo
1ae80 77 3b 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  w;     /* Code t
1ae90 6f 20 70 72 6f 63 65 73 73 20 61 20 73 69 6e 67  o process a sing
1aea0 6c 65 20 69 6e 70 75 74 20 72 6f 77 20 2a 2f 0a  le input row */.
1aeb0 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b      int addrEnd;
1aec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1aed0 6e 64 20 6f 66 20 61 6c 6c 20 70 72 6f 63 65 73  nd of all proces
1aee0 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sing */.    int 
1aef0 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20  addrSortingIdx; 
1af00 20 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70      /* The OP_Op
1af10 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20  enEphemeral for 
1af20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
1af30 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  x */.    int add
1af40 72 52 65 73 65 74 3b 20 20 20 20 20 20 20 20 20  rReset;         
1af50 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66   /* Subroutine f
1af60 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65  or resetting the
1af70 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a   accumulator */.
1af80 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73  .    addrEnd = s
1af90 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1afa0 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  bel(v);..    /* 
1afb0 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d  Convert TK_COLUM
1afc0 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f  N nodes into TK_
1afd0 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d  AGG_COLUMN and m
1afe0 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  ake entries in. 
1aff0 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66     ** sAggInfo f
1b000 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55  or all TK_AGG_FU
1b010 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
1b020 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
1b030 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  he.    ** SELECT
1b040 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
1b050 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
1b060 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
1b070 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
1b080 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
1b090 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
1b0a0 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73   pTabList;.    s
1b0b0 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73  NC.pAggInfo = &s
1b0c0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67  AggInfo;.    sAg
1b0d0 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
1b0e0 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20  lumn = pGroupBy 
1b0f0 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  ? pGroupBy->nExp
1b100 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67  r+1 : 0;.    sAg
1b110 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d  gInfo.pGroupBy =
1b120 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73   pGroupBy;.    s
1b130 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
1b140 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
1b150 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
1b160 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
1b170 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64  gList(&sNC, pOrd
1b180 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  erBy);.    if( p
1b190 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
1b1a0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
1b1b0 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e  zeAggregates(&sN
1b1c0 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  C, pHaving);.   
1b1d0 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   }.    sAggInfo.
1b1e0 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73  nAccumulator = s
1b1f0 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
1b200 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1b210 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20  sAggInfo.nFunc; 
1b220 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
1b230 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
1b240 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67  gList(&sNC, sAgg
1b250 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45  Info.aFunc[i].pE
1b260 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  xpr->pList);.   
1b270 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
1b280 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
1b290 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
1b2a0 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e      /* Processin
1b2b0 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73  g for aggregates
1b2c0 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69   with GROUP BY i
1b2d0 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74  s very different
1b2e0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68   and.    ** much
1b2f0 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68   more complex th
1b300 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69  an aggregates wi
1b310 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59  thout a GROUP BY
1b320 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1b330 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
1b340 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
1b350 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67  Info;  /* Keying
1b360 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
1b370 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c   the group by cl
1b380 61 75 73 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  ause */..      /
1b390 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20  * Create labels 
1b3a0 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
1b3b0 6e 65 65 64 69 6e 67 0a 20 20 20 20 20 20 2a 2f  needing.      */
1b3c0 0a 20 20 20 20 20 0a 20 20 20 20 20 20 61 64 64  .     .      add
1b3d0 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 20  rInitializeLoop 
1b3e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1b3f0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1b400 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e   addrGroupByChan
1b410 67 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ge = sqlite3Vdbe
1b420 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1b430 20 20 20 20 61 64 64 72 50 72 6f 63 65 73 73 52      addrProcessR
1b440 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
1b450 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
1b460 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
1b470 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63   is a GROUP BY c
1b480 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e  lause we might n
1b490 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  eed a sorting in
1b4a0 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  dex to.      ** 
1b4b0 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41  implement it.  A
1b4c0 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72  llocate that sor
1b4d0 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20  ting index now. 
1b4e0 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74   If it turns out
1b4f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
1b500 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74  e do not need it
1b510 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20   after all, the 
1b520 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
1b530 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20  struction.      
1b540 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  ** will be conve
1b550 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70  rted into a Noop
1b560 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  .  .      */.   
1b570 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
1b580 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d  ingIdx = pParse-
1b590 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >nTab++;.      p
1b5a0 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
1b5b0 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
1b5c0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b  arse, pGroupBy);
1b5d0 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69  .      addrSorti
1b5e0 6e 67 49 64 78 20 3d 0a 20 20 20 20 20 20 20 20  ngIdx =.        
1b5f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b600 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
1b610 68 65 6d 65 72 61 6c 2c 20 73 41 67 67 49 6e 66  hemeral, sAggInf
1b620 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20  o.sortingIdx,.  
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b640 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
1b650 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20  nSortingColumn, 
1b660 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1b670 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
1b680 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
1b690 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
1b6a0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74  ;..      /* Init
1b6b0 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f  ialize memory lo
1b6c0 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20  cations used by 
1b6d0 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61  GROUP BY aggrega
1b6e0 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20  te processing.  
1b6f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73      */.      iUs
1b700 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  eFlag = ++pParse
1b710 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41  ->nMem;.      iA
1b720 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61  bortFlag = ++pPa
1b730 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1b740 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iAMem = pParse-
1b750 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
1b760 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
1b770 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
1b780 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20  ;.      iBMem = 
1b790 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
1b7a0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
1b7b0 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
1b7c0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
1b7d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b7e0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1b7f0 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  0, iAbortFlag);.
1b800 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1b810 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f  t((v, "clear abo
1b820 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
1b830 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b840 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1b850 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 0, iUseFlag);
1b860 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1b870 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
1b880 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70   accumulator emp
1b890 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ty"));.      sql
1b8a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b8b0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
1b8c0 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70  drInitializeLoop
1b8d0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
1b8e0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
1b8f0 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
1b900 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
1b910 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
1b920 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73   ** set.  This s
1b930 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20  ubroutine first 
1b940 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73  looks at the iUs
1b950 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46  eFlag.  If iUseF
1b960 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  lag.      ** is 
1b970 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
1b980 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20  al to zero, the 
1b990 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20  subroutine is a 
1b9a0 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20  no-op.  If.     
1b9b0 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69   ** the processi
1b9c0 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  ng calls for the
1b9d0 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c   query to abort,
1b9e0 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
1b9f0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d  .      ** increm
1ba00 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46  ents the iAbortF
1ba10 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lag memory locat
1ba20 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ion before retur
1ba30 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a  ning in.      **
1ba40 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c   order to signal
1ba50 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61   the caller to a
1ba60 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bort..      */. 
1ba70 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72       addrSetAbor
1ba80 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
1ba90 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1baa0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1bab0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1bac0 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46  eger, 1, iAbortF
1bad0 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
1bae0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74  Comment((v, "set
1baf0 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
1bb00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1bb10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
1bb20 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  turn, 0, 0);.   
1bb30 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
1bb40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1bb50 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
1bb60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bb70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
1bb80 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64  s, iUseFlag, add
1bb90 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20  rOutputRow+2);. 
1bba0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1bbb0 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65  ((v, "Groupby re
1bbc0 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65  sult generator e
1bbd0 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20  ntry point"));. 
1bbe0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1bbf0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 74  AddOp2(v, OP_Ret
1bc00 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  urn, 0, 0);.    
1bc10 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e    finalizeAggFun
1bc20 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26  ctions(pParse, &
1bc30 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
1bc40 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
1bc50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1bc60 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1bc70 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
1bc80 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c  OutputRow+1, SQL
1bc90 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
1bca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1bcb0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
1bcc0 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
1bcd0 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
1bce0 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rBy,.           
1bcf0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69             disti
1bd00 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20  nct, pDest,.    
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b    addrOutputRow+
1bd30 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74 2c  1, addrSetAbort,
1bd40 20 61 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c   aff);.      sql
1bd50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1bd60 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20  , OP_Return, 0, 
1bd70 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  0);.      VdbeCo
1bd80 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67  mment((v, "end g
1bd90 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65  roupby result ge
1bda0 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  nerator"));..   
1bdb0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
1bdc0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
1bdd0 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20   will reset the 
1bde0 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c  group-by accumul
1bdf0 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ator.      */.  
1be00 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20      addrReset = 
1be10 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1be20 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
1be30 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
1be40 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
1be50 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
1be60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1be70 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30   OP_Return, 0, 0
1be80 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67  );..      /* Beg
1be90 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77  in a loop that w
1bea0 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20  ill extract all 
1beb0 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47  source rows in G
1bec0 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20  ROUP BY order.. 
1bed0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
1bee0 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73  ht involve two s
1bef0 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69  eparate loops wi
1bf00 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e  th an OP_Sort in
1bf10 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20   between, or.   
1bf20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
1bf30 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20  e a single loop 
1bf40 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64  that uses an ind
1bf50 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e  ex to extract in
1bf60 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20  formation.      
1bf70 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20  ** in the right 
1bf80 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77  order to begin w
1bf90 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ith..      */.  
1bfa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1bfb0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
1bfc0 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f  ddrInitializeLoo
1bfd0 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
1bfe0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1bff0 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72  P_Gosub, 0, addr
1c000 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57  Reset);.      pW
1c010 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
1c020 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
1c030 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
1c040 65 2c 20 26 70 47 72 6f 75 70 42 79 2c 20 30 29  e, &pGroupBy, 0)
1c050 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
1c060 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
1c070 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69  ect_end;.      i
1c080 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  f( pGroupBy==0 )
1c090 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
1c0a0 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62   optimizer is ab
1c0b0 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f  le to deliver ro
1c0c0 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f  ws in group by o
1c0d0 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20  rder so.        
1c0e0 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76  ** we do not hav
1c0f0 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20  e to sort.  The 
1c100 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1c110 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20   table will be. 
1c120 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c         ** cancel
1c130 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73  led later becaus
1c140 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  e we still need 
1c150 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49  to use the pKeyI
1c160 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nfo.        */. 
1c170 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20         pGroupBy 
1c180 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
1c190 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
1c1a0 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rt = 0;.      }e
1c1b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
1c1c0 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20  Rows are coming 
1c1d0 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69  out in undetermi
1c1e0 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68  ned order.  We h
1c1f0 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20  ave to push.    
1c200 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20      ** each row 
1c210 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69  into a sorting i
1c220 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20  ndex, terminate 
1c230 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a  the first loop,.
1c240 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
1c250 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f  loop over the so
1c260 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f  rting index in o
1c270 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
1c280 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a  output.        *
1c290 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  * in sorted orde
1c2a0 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  r.        */.   
1c2b0 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65       int regBase
1c2c0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  ;.        int re
1c2d0 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20  gRecord;.       
1c2e0 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
1c2f0 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b     int nGroupBy;
1c300 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  ..        groupB
1c310 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  ySort = 1;.     
1c320 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47     nGroupBy = pG
1c330 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
1c340 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47         nCol = nG
1c350 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20  roupBy + 1;.    
1c360 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
1c370 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  +1;.        for(
1c380 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
1c390 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
1c3a0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67           if( sAg
1c3b0 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53  gInfo.aCol[i].iS
1c3c0 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
1c3d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43  {.            nC
1c3e0 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ol++;.          
1c3f0 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
1c400 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1c410 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73       regBase = s
1c420 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1c430 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29  ge(pParse, nCol)
1c440 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1c450 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
1c460 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
1c470 42 79 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20  By, regBase);.  
1c480 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c490 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
1c4a0 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f  quence, sAggInfo
1c4b0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72 65 67 42  .sortingIdx,regB
1c4c0 61 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b 0a 20  ase+nGroupBy);. 
1c4d0 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
1c4e0 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66  pBy+1;.        f
1c4f0 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
1c500 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
1c510 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
1c520 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
1c530 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f  pCol = &sAggInfo
1c540 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  .aCol[i];.      
1c550 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
1c560 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
1c570 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1c580 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
1c590 43 6f 6c 75 6d 6e 28 76 2c 20 70 43 6f 6c 2d 3e  Column(v, pCol->
1c5a0 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c  pTab, pCol->iCol
1c5b0 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c  umn, pCol->iTabl
1c5c0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
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 6a 20 2b 20 72 65 67 42          j + regB
1c5f0 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ase);.          
1c600 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
1c610 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1c620 20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d       regRecord =
1c630 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1c640 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
1c650 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c660 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
1c670 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c  Record, regBase,
1c680 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64   nCol, regRecord
1c690 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1c6a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1c6b0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 73 41  OP_IdxInsert, sA
1c6c0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
1c6d0 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
1c6e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
1c6f0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1c700 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
1c710 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c720 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1c730 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
1c740 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
1c750 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1c760 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
1c770 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c780 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  Op2(v, OP_Sort, 
1c790 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
1c7a0 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  Idx, addrEnd);. 
1c7b0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
1c7c0 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59  nt((v, "GROUP BY
1c7d0 20 73 6f 72 74 22 29 29 3b 0a 20 20 20 20 20 20   sort"));.      
1c7e0 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f    sAggInfo.useSo
1c7f0 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20  rtingIdx = 1;.  
1c800 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1c810 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72  Evaluate the cur
1c820 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
1c830 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  rms and store in
1c840 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20   b0, b1, b2.... 
1c850 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d       ** (b0 is m
1c860 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69  emory location i
1c870 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42  BMem+0, b1 is iB
1c880 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f  Mem+1, and so fo
1c890 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68  rth).      ** Th
1c8a0 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63  en compare the c
1c8b0 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
1c8c0 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68  terms against th
1c8d0 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  e GROUP BY terms
1c8e0 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  .      ** from t
1c8f0 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
1c900 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
1c910 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e   in a0, a1, a2..
1c920 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1c930 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d   addrTopOfLoop =
1c940 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1c950 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1c960 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72    for(j=0; j<pGr
1c970 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b  oupBy->nExpr; j+
1c980 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1c990 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
1c9a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1c9b0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1c9c0 5f 43 6f 6c 75 6d 6e 2c 20 73 41 67 67 49 6e 66  _Column, sAggInf
1c9d0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 6a 2c  o.sortingIdx, j,
1c9e0 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
1c9f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ca00 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72      sAggInfo.dir
1ca10 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ectMode = 1;.   
1ca20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ca30 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1ca40 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45  GroupBy->a[j].pE
1ca50 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  xpr, iBMem+j);. 
1ca60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1ca70 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 47 72  .      for(j=pGr
1ca80 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20  oupBy->nExpr-1; 
1ca90 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20  j>=0; j--){.    
1caa0 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 7b 0a      if( j==0 ){.
1cab0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1cac0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1cad0 50 5f 45 71 2c 20 69 41 4d 65 6d 2b 6a 2c 20 61  P_Eq, iAMem+j, a
1cae0 64 64 72 50 72 6f 63 65 73 73 52 6f 77 2c 20 69  ddrProcessRow, i
1caf0 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
1cb00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cb10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cb20 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 69 41  Op3(v, OP_Ne, iA
1cb30 4d 65 6d 2b 6a 2c 20 61 64 64 72 47 72 6f 75 70  Mem+j, addrGroup
1cb40 42 79 43 68 61 6e 67 65 2c 20 69 42 4d 65 6d 2b  ByChange, iBMem+
1cb50 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  j);.        }.  
1cb60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1cb70 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
1cb80 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f   (void*)pKeyInfo
1cb90 2d 3e 61 43 6f 6c 6c 5b 6a 5d 2c 20 50 34 5f 43  ->aColl[j], P4_C
1cba0 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20  OLLSEQ);.       
1cbb0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1cbc0 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
1cbd0 55 4c 4c 45 51 55 41 4c 29 3b 0a 20 20 20 20 20  ULLEQUAL);.     
1cbe0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e   }..      /* Gen
1cbf0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1cc00 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68  runs whenever th
1cc10 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67  e GROUP BY chang
1cc20 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61  es..      ** Cha
1cc30 6e 67 65 20 69 6e 20 74 68 65 20 47 52 4f 55 50  nge in the GROUP
1cc40 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64   BY are detected
1cc50 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
1cc60 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62   code.      ** b
1cc70 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20  lock.  If there 
1cc80 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c  were no changes,
1cc90 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73   this block is s
1cca0 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  kipped..      **
1ccb0 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63  .      ** This c
1ccc0 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65  ode copies curre
1ccd0 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d  nt group by term
1cce0 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e  s in b0,b1,b2,..
1ccf0 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20  ..      ** over 
1cd00 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74  to a0,a1,a2.  It
1cd10 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20   then calls the 
1cd20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
1cd30 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  e.      ** and r
1cd40 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67  esets the aggreg
1cd50 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
1cd60 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65  registers in pre
1cd70 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  paration.      *
1cd80 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47  * for the next G
1cd90 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20  ROUP BY batch.. 
1cda0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
1cdb0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1cdc0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 47 72 6f  Label(v, addrGro
1cdd0 75 70 42 79 43 68 61 6e 67 65 29 3b 0a 20 20 20  upByChange);.   
1cde0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47     for(j=0; j<pG
1cdf0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a  roupBy->nExpr; j
1ce00 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
1ce10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ce20 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 42 4d 65 6d  , OP_Move, iBMem
1ce30 2b 6a 2c 20 69 41 4d 65 6d 2b 6a 29 3b 0a 20 20  +j, iAMem+j);.  
1ce40 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1ce50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ce60 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64   OP_Gosub, 0, ad
1ce70 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
1ce80 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1ce90 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20  (v, "output one 
1cea0 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71  row"));.      sq
1ceb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1cec0 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62  v, OP_IfPos, iAb
1ced0 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64  ortFlag, addrEnd
1cee0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1cef0 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20  ment((v, "check 
1cf00 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
1cf10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1cf20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1cf30 75 62 2c 20 30 2c 20 61 64 64 72 52 65 73 65 74  ub, 0, addrReset
1cf40 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1cf50 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20  ment((v, "reset 
1cf60 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
1cf70 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
1cf80 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
1cf90 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65  ccumulators base
1cfa0 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d on the content
1cfb0 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
1cfc0 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20   current row.   
1cfd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
1cfe0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1cff0 62 65 6c 28 76 2c 20 61 64 64 72 50 72 6f 63 65  bel(v, addrProce
1d000 73 73 52 6f 77 29 3b 0a 20 20 20 20 20 20 75 70  ssRow);.      up
1d010 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
1d020 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
1d030 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
1d040 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d050 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55  P_Integer, 1, iU
1d060 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  seFlag);.      V
1d070 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1d080 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e  indicate data in
1d090 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
1d0a0 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f  ..      /* End o
1d0b0 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20  f the loop.     
1d0c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72   */.      if( gr
1d0d0 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
1d0e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d0f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
1d100 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
1d110 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f  ingIdx, addrTopO
1d120 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 65  fLoop);.      }e
1d130 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1d140 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
1d150 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  nfo);.        sq
1d160 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
1d170 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72  oNoop(v, addrSor
1d180 74 69 6e 67 49 64 78 2c 20 31 29 3b 0a 20 20 20  tingIdx, 1);.   
1d190 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f     }..      /* O
1d1a0 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20  utput the final 
1d1b0 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20  row of result.  
1d1c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
1d1d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d1e0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61  , OP_Gosub, 0, a
1d1f0 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
1d200 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1d210 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e  ((v, "output fin
1d220 61 6c 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20  al row"));.     
1d230 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66   .    } /* endif
1d240 20 70 47 72 6f 75 70 42 79 20 2a 2f 0a 20 20 20   pGroupBy */.   
1d250 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78   else {.      Ex
1d260 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20  prList *pMinMax 
1d270 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72 4c  = 0;.      ExprL
1d280 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 20  ist *pDel = 0;. 
1d290 20 20 20 20 20 75 38 20 66 6c 61 67 3b 0a 0a 20       u8 flag;.. 
1d2a0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66       /* Check if
1d2b0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66   the query is of
1d2c0 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c   one of the foll
1d2d0 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20  owing forms:.   
1d2e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
1d2f0 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46   SELECT min(x) F
1d300 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  ROM ....      **
1d310 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29     SELECT max(x)
1d320 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20   FROM ....      
1d330 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 69  **.      ** If i
1d340 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74  t is, then ask t
1d350 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  he code in where
1d360 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  .c to attempt to
1d370 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20   sort results.  
1d380 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65      ** as if the
1d390 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52  re was an "ORDER
1d3a0 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52   ON x" or "ORDER
1d3b0 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75   ON x DESC" clau
1d3c0 73 65 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 66  se. .      ** If
1d3d0 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65   where.c is able
1d3e0 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75   to produce resu
1d3f0 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68  lts sorted in th
1d400 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20  is order, then. 
1d410 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65       ** add vdbe
1d420 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f   code to break o
1d430 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73  ut of the proces
1d440 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20  sing loop after 
1d450 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  the .      ** fi
1d460 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73  rst iteration (s
1d470 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69  ince the first i
1d480 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
1d490 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 2a  loop is .      *
1d4a0 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
1d4b0 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72  operate on the r
1d4c0 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69  ow with the mini
1d4d0 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a  mum or maximum .
1d4e0 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f        ** value o
1d4f0 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f  f x, the only ro
1d500 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20  w required)..   
1d510 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41     **.      ** A
1d520 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75   special flag mu
1d530 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  st be passed to 
1d540 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1d550 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a  n() to slightly.
1d560 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20        ** modify 
1d570 62 65 68 61 76 69 6f 75 72 20 61 73 20 66 6f 6c  behaviour as fol
1d580 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  lows:.      **. 
1d590 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74       **   + If t
1d5a0 68 65 20 71 75 65 72 79 20 69 73 20 61 20 22 53  he query is a "S
1d5b0 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74  ELECT min(x)", t
1d5c0 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64  hen the loop cod
1d5d0 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 20  ed by.      **  
1d5e0 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c     where.c shoul
1d5f0 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76  d not iterate ov
1d600 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69  er any values wi
1d610 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a  th a NULL value.
1d620 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72        **     for
1d630 20 78 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20   x..      **.   
1d640 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70     **   + The op
1d650 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20  timizer code in 
1d660 77 68 65 72 65 2e 63 20 28 74 68 65 20 74 68 69  where.c (the thi
1d670 6e 67 20 74 68 61 74 20 64 65 63 69 64 65 73 20  ng that decides 
1d680 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 20  which.      **  
1d690 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69     index or indi
1d6a0 63 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75  ces to use) shou
1d6b0 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65  ld place a diffe
1d6c0 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e  rent priority on
1d6d0 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73   .      **     s
1d6e0 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f  atisfying the 'O
1d6f0 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20  RDER BY' clause 
1d700 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20  than it does in 
1d710 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20  other cases..   
1d720 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20     **     Refer 
1d730 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d  to code and comm
1d740 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20  ents in where.c 
1d750 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20  for details..   
1d760 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67     */.      flag
1d770 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 70   = minMaxQuery(p
1d780 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
1d790 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20   if( flag ){.   
1d7a0 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e       pDel = pMin
1d7b0 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Max = sqlite3Exp
1d7c0 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
1d7d0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
1d7e0 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  pr->pList);.    
1d7f0 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20      if( pMinMax 
1d800 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
1d810 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
1d820 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
1d830 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 28 66 6c  sortOrder = ((fl
1d840 61 67 3d 3d 4f 52 44 45 52 42 59 5f 4d 49 4e 29  ag==ORDERBY_MIN)
1d850 3f 30 3a 31 29 3b 0a 20 20 20 20 20 20 20 20 20  ?0:1);.         
1d860 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70   pMinMax->a[0].p
1d870 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f  Expr->op = TK_CO
1d880 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  LUMN;.        }.
1d890 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1d8a0 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73  * This case runs
1d8b0 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74   if the aggregat
1d8c0 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42  e has no GROUP B
1d8d0 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20  Y clause.  The. 
1d8e0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
1d8f0 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c  ng is much simpl
1d900 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  er since there i
1d910 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
1d920 72 6f 77 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  row.      ** of 
1d930 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2f  output..      */
1d940 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75  .      resetAccu
1d950 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
1d960 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
1d970 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
1d980 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
1d990 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
1d9a0 57 68 65 72 65 2c 20 26 70 4d 69 6e 4d 61 78 2c  Where, &pMinMax,
1d9b0 20 66 6c 61 67 29 3b 0a 20 20 20 20 20 20 69 66   flag);.      if
1d9c0 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  ( pWInfo==0 ){. 
1d9d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1d9e0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 44 65  prListDelete(pDe
1d9f0 6c 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  l);.        goto
1da00 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
1da10 20 20 20 7d 0a 20 20 20 20 20 20 75 70 64 61 74     }.      updat
1da20 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
1da30 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
1da40 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d 69 6e  .      if( !pMin
1da50 4d 61 78 20 26 26 20 66 6c 61 67 20 29 7b 0a 20  Max && flag ){. 
1da60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1da70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1da80 6f 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e  oto, 0, pWInfo->
1da90 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
1daa0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1dab0 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78 22   "%s() by index"
1dac0 2c 20 28 66 6c 61 67 3d 3d 4f 52 44 45 52 42 59  , (flag==ORDERBY
1dad0 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22  _MIN?"min":"max"
1dae0 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )));.      }.   
1daf0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
1db00 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
1db10 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e    finalizeAggFun
1db20 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26  ctions(pParse, &
1db30 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
1db40 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
1db50 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67       if( pHaving
1db60 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1db70 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1db80 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
1db90 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f  addrEnd, SQLITE_
1dba0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1dbb0 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63     }.      selec
1dbc0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
1dbd0 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
1dbe0 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20   0, 0, 0, -1, . 
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc00 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72       pDest, addr
1dc10 45 6e 64 2c 20 61 64 64 72 45 6e 64 2c 20 61 66  End, addrEnd, af
1dc20 66 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  f);..      sqlit
1dc30 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
1dc40 28 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (pDel);.    }.  
1dc50 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1dc60 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
1dc70 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20  rEnd);.    .  } 
1dc80 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61  /* endif aggrega
1dc90 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f  te query */..  /
1dca0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
1dcb0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1dcc0 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
1dcd0 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c  o sort the resul
1dce0 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64  ts.  ** and send
1dcf0 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c   them to the cal
1dd00 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65  lback one by one
1dd10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
1dd20 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e  derBy ){.    gen
1dd30 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
1dd40 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69  arse, p, v, pELi
1dd50 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74  st->nExpr, pDest
1dd60 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
1dd70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1dd80 55 45 52 59 0a 20 20 2f 2a 20 49 66 20 74 68 69  UERY.  /* If thi
1dd90 73 20 77 61 73 20 61 20 73 75 62 71 75 65 72 79  s was a subquery
1dda0 2c 20 77 65 20 68 61 76 65 20 6e 6f 77 20 63 6f  , we have now co
1ddb0 6e 76 65 72 74 65 64 20 74 68 65 20 73 75 62 71  nverted the subq
1ddc0 75 65 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a  uery into a.  **
1ddd0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1dde0 2e 20 20 53 6f 20 73 65 74 20 74 68 65 20 53 72  .  So set the Sr
1ddf0 63 4c 69 73 74 5f 69 74 65 6d 2e 69 73 50 6f 70  cList_item.isPop
1de00 75 6c 61 74 65 64 20 66 6c 61 67 20 74 6f 20 70  ulated flag to p
1de10 72 65 76 65 6e 74 0a 20 20 2a 2a 20 74 68 69 73  revent.  ** this
1de20 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62   subquery from b
1de30 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61  eing evaluated a
1de40 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63  gain and to forc
1de50 65 20 74 68 65 20 75 73 65 20 6f 66 0a 20 20 2a  e the use of.  *
1de60 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
1de70 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
1de80 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ( pParent ){.   
1de90 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1dea0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72  ->pSrc->nSrc>par
1deb0 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73  entTab );.    as
1dec0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1ded0 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62  Src->a[parentTab
1dee0 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a  ].pSelect==p );.
1def0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72      pParent->pSr
1df00 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e  c->a[parentTab].
1df10 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b  isPopulated = 1;
1df20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1df30 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
1df40 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20  kip this query. 
1df50 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1df60 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1df70 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68   iEnd);..  /* Th
1df80 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63  e SELECT was suc
1df90 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e  cessfully coded.
1dfa0 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72     Set the retur
1dfb0 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a  n code to 0.  **
1dfc0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20   to indicate no 
1dfd0 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72  errors..  */.  r
1dfe0 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  c = 0;..  /* Con
1dff0 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65  trol jumps to he
1e000 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  re if an error i
1e010 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62  s encountered ab
1e020 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a  ove, or upon.  *
1e030 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64  * successful cod
1e040 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ing of the SELEC
1e050 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65  T..  */.select_e
1e060 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69  nd:..  /* Identi
1e070 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  fy column names 
1e080 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  if we will be us
1e090 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61  ing them in a ca
1e0a0 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
1e0b0 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
1e0c0 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
1e0d0 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d   is going to som
1e0e0 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74  e other destinat
1e0f0 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
1e100 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1e110 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
1e120 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
1e130 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
1e140 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
1e150 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
1e160 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
1e170 5f 66 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61  _free(sAggInfo.a
1e180 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Col);.  sqlite3_
1e190 66 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61 46  free(sAggInfo.aF
1e1a0 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unc);.  return r
1e1b0 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  c;.}..#if define
1e1c0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
1e1d0 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /*.*************
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 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
1e230 69 6e 67 20 63 6f 64 65 20 69 73 20 75 73 65 64  ing code is used
1e240 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
1e250 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
1e260 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68    The code.** th
1e270 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20  at follows does 
1e280 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f  not appear in no
1e290 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a  rmal builds..**.
1e2a0 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
1e2b0 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 70 72  s are used to pr
1e2c0 69 6e 74 20 6f 75 74 20 74 68 65 20 63 6f 6e 74  int out the cont
1e2d0 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61  ent of all or pa
1e2e0 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73  rt of a .** pars
1e2f0 65 20 73 74 72 75 63 74 75 72 65 73 20 73 75 63  e structures suc
1e300 68 20 61 73 20 53 65 6c 65 63 74 20 6f 72 20 45  h as Select or E
1e310 78 70 72 2e 20 20 53 75 63 68 20 70 72 69 6e 74  xpr.  Such print
1e320 6f 75 74 73 20 61 72 65 20 75 73 65 66 75 6c 0a  outs are useful.
1e330 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e 67 20 74  ** for helping t
1e340 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 77 68 61  o understand wha
1e350 74 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 69  t is happening i
1e360 6e 73 69 64 65 20 74 68 65 20 63 6f 64 65 20 67  nside the code g
1e370 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69  enerator.** duri
1e380 6e 67 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e  ng the execution
1e390 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45   of complex SELE
1e3a0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
1e3b0 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
1e3c0 6e 65 20 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65  ne are not calle
1e3d0 64 20 61 6e 79 77 68 65 72 65 20 66 72 6f 6d 20  d anywhere from 
1e3e0 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61  within the norma
1e3f0 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73 65 2e 20  l.** code base. 
1e400 20 54 68 65 6e 20 61 72 65 20 69 6e 74 65 6e 64   Then are intend
1e410 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
1e420 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20  from within the 
1e430 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66  debugger.** or f
1e440 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20 22 70  rom temporary "p
1e450 72 69 6e 74 66 22 20 73 74 61 74 65 6d 65 6e 74  rintf" statement
1e460 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20 64  s inserted for d
1e470 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  ebugging..*/.voi
1e480 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78  d sqlite3PrintEx
1e490 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  pr(Expr *p){.  i
1e4a0 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26  f( p->token.z &&
1e4b0 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30 20 29 7b   p->token.n>0 ){
1e4c0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1e4d0 67 50 72 69 6e 74 66 28 22 28 25 2e 2a 73 22 2c  gPrintf("(%.*s",
1e4e0 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e   p->token.n, p->
1e4f0 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d 65 6c 73  token.z);.  }els
1e500 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e{.    sqlite3De
1e510 62 75 67 50 72 69 6e 74 66 28 22 28 25 64 22 2c  bugPrintf("(%d",
1e520 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20 69   p->op);.  }.  i
1e530 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  f( p->pLeft ){. 
1e540 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1e550 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20  rintf(" ");.    
1e560 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
1e570 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a  (p->pLeft);.  }.
1e580 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20    if( p->pRight 
1e590 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
1e5a0 62 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a  bugPrintf(" ");.
1e5b0 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
1e5c0 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 29 3b  Expr(p->pRight);
1e5d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
1e5e0 62 75 67 50 72 69 6e 74 66 28 22 29 22 29 3b 0a  bugPrintf(")");.
1e5f0 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72  }.void sqlite3Pr
1e600 69 6e 74 45 78 70 72 4c 69 73 74 28 45 78 70 72  intExprList(Expr
1e610 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
1e620 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1e630 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
1e640 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1e650 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 4c 69  te3PrintExpr(pLi
1e660 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
1e670 0a 20 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74  .    if( i<pList
1e680 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20  ->nExpr-1 ){.   
1e690 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1e6a0 72 69 6e 74 66 28 22 2c 20 22 29 3b 0a 20 20 20  rintf(", ");.   
1e6b0 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71   }.  }.}.void sq
1e6c0 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74  lite3PrintSelect
1e6d0 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
1e6e0 69 6e 64 65 6e 74 29 7b 0a 20 20 73 71 6c 69 74  indent){.  sqlit
1e6f0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
1e700 2a 73 53 45 4c 45 43 54 28 25 70 29 20 22 2c 20  *sSELECT(%p) ", 
1e710 69 6e 64 65 6e 74 2c 20 22 22 2c 20 70 29 3b 0a  indent, "", p);.
1e720 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
1e730 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
1e740 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
1e750 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
1e760 20 69 66 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a   if( p->pSrc ){.
1e770 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65 66 69      char *zPrefi
1e780 78 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  x;.    int i;.  
1e790 20 20 7a 50 72 65 66 69 78 20 3d 20 22 46 52 4f    zPrefix = "FRO
1e7a0 4d 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  M";.    for(i=0;
1e7b0 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
1e7c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
1e7d0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1e7e0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70  m *pItem = &p->p
1e7f0 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
1e800 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1e810 6e 74 66 28 22 25 2a 73 20 22 2c 20 69 6e 64 65  ntf("%*s ", inde
1e820 6e 74 2b 36 2c 20 7a 50 72 65 66 69 78 29 3b 0a  nt+6, zPrefix);.
1e830 20 20 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20        zPrefix = 
1e840 22 22 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  "";.      if( pI
1e850 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
1e860 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
1e870 65 62 75 67 50 72 69 6e 74 66 28 22 28 5c 6e 22  ebugPrintf("(\n"
1e880 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1e890 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28 70 49  e3PrintSelect(pI
1e8a0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 6e  tem->pSelect, in
1e8b0 64 65 6e 74 2b 31 30 29 3b 0a 20 20 20 20 20 20  dent+10);.      
1e8c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1e8d0 69 6e 74 66 28 22 25 2a 73 29 22 2c 20 69 6e 64  intf("%*s)", ind
1e8e0 65 6e 74 2b 38 2c 20 22 22 29 3b 0a 20 20 20 20  ent+8, "");.    
1e8f0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65    }else if( pIte
1e900 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  m->zName ){.    
1e910 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1e920 50 72 69 6e 74 66 28 22 25 73 22 2c 20 70 49 74  Printf("%s", pIt
1e930 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
1e940 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
1e950 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  tem->pTab ){.   
1e960 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
1e970 67 50 72 69 6e 74 66 28 22 28 74 61 62 6c 65 3a  gPrintf("(table:
1e980 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54   %s)", pItem->pT
1e990 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
1e9a0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
1e9b0 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
1e9c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
1e9d0 62 75 67 50 72 69 6e 74 66 28 22 20 41 53 20 25  bugPrintf(" AS %
1e9e0 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  s", pItem->zAlia
1e9f0 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
1ea00 20 20 69 66 28 20 69 3c 70 2d 3e 70 53 72 63 2d    if( i<p->pSrc-
1ea10 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20 20 20  >nSrc-1 ){.     
1ea20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1ea30 72 69 6e 74 66 28 22 2c 22 29 3b 0a 20 20 20 20  rintf(",");.    
1ea40 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1ea50 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
1ea60 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
1ea70 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b  if( p->pWhere ){
1ea80 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1ea90 67 50 72 69 6e 74 66 28 22 25 2a 73 20 57 48 45  gPrintf("%*s WHE
1eaa0 52 45 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  RE ", indent, ""
1eab0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
1eac0 69 6e 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72  intExpr(p->pWher
1ead0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
1eae0 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
1eaf0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
1eb00 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73  GroupBy ){.    s
1eb10 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1eb20 66 28 22 25 2a 73 20 47 52 4f 55 50 20 42 59 20  f("%*s GROUP BY 
1eb30 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
1eb40 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
1eb50 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
1eb60 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  upBy);.    sqlit
1eb70 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
1eb80 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n");.  }.  if( p
1eb90 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ->pHaving ){.   
1eba0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1ebb0 6e 74 66 28 22 25 2a 73 20 48 41 56 49 4e 47 20  ntf("%*s HAVING 
1ebc0 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
1ebd0 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
1ebe0 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 29  Expr(p->pHaving)
1ebf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
1ec00 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
1ec10 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72    }.  if( p->pOr
1ec20 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
1ec30 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1ec40 22 25 2a 73 20 4f 52 44 45 52 20 42 59 20 22 2c  "%*s ORDER BY ",
1ec50 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
1ec60 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
1ec70 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
1ec80 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
1ec90 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
1eca0 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20  );.  }.}./* End 
1ecb0 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
1ecc0 20 64 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20   debug printing 
1ecd0 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  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 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  **/.#endif /* de
1ed30 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
1ed40 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
1ed50 4c 49 54 45 5f 44 45 42 55 47 29 20 2a 2f 0a     LITE_DEBUG) */.