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

Artifact 35063b078beafe9aa35344a8ce039210920d7fea:


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 37  select.c,v 1.417
0200: 20 32 30 30 38 2f 30 33 2f 32 32 20 30 31 3a 30   2008/03/22 01:0
0210: 37 3a 31 38 20 64 72 68 20 45 78 70 20 24 0a 2a  7:18 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 69 64 2c 20 26 70 2d 3e  , regRowid, &p->
6780: 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
6790: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
67a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
67b0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65  nsert, iParm, re
67c0: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
67d0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
67e0: 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20  re(v, j1);.     
67f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6800: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
6810: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
6820: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
6830: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6840: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 6f 76 65  ddOp2(v, OP_Move
6850: 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 29  , regRow, iParm)
6860: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
6870: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
6880: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
6890: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
68a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
68b0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
68c0: 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20   SRT_Callback:. 
68d0: 20 20 20 63 61 73 65 20 53 52 54 5f 53 75 62 72     case SRT_Subr
68e0: 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  outine: {.      
68f0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c  int i;.      sql
6900: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6910: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
6920: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
6930: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6940: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
6950: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 72 65 67  , pseudoTab, reg
6960: 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Row, regRowid);.
6970: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
6980: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
6990: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
69a0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
69b0: 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64 6f 54 61  Column, pseudoTa
69c0: 62 2c 20 69 2c 20 70 44 65 73 74 2d 3e 69 4d 65  b, i, pDest->iMe
69d0: 6d 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  m+i);.      }.  
69e0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
69f0: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
6a00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6a10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
6a20: 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d  esultRow, pDest-
6a30: 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  >iMem, nColumn);
6a40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6a50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6a60: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
6a70: 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a  sub, 0, iParm);.
6a80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
6a90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
6aa0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
6ab0: 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
6ac0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6ad0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
6ae0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
6af0: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b  pParse, regRow);
6b00: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
6b10: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6b20: 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f   regRowid);..  /
6b30: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
6b40: 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 68  d of the loop wh
6b50: 65 6e 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  en the LIMIT is 
6b60: 72 65 61 63 68 65 64 0a 20 20 2a 2f 0a 20 20 69  reached.  */.  i
6b70: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20  f( p->iLimit>=0 
6b80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
6b90: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
6ba0: 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74  ddImm, p->iLimit
6bb0: 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , -1);.    sqlit
6bc0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6bd0: 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
6be0: 69 6d 69 74 2c 20 62 72 6b 29 3b 0a 20 20 7d 0a  imit, brk);.  }.
6bf0: 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d  .  /* The bottom
6c00: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a   of the loop.  *
6c10: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
6c20: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63  esolveLabel(v, c
6c30: 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ont);.  sqlite3V
6c40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6c50: 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
6c60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6c70: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
6c80: 62 72 6b 29 3b 0a 20 20 69 66 28 20 65 44 65 73  brk);.  if( eDes
6c90: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
6ca0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75  || eDest==SRT_Su
6cb0: 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  broutine ){.    
6cc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6cd0: 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  2(v, OP_Close, p
6ce0: 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20  seudoTab, 0);.  
6cf0: 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  }..}../*.** Retu
6d00: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
6d10: 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  a string contain
6d20: 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61  ing the 'declara
6d30: 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68  tion type' of th
6d40: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
6d50: 70 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e  pExpr. The strin
6d60: 67 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64  g may be treated
6d70: 20 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68   as static by th
6d80: 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
6d90: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
6da0: 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63  type is the exac
6db0: 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e  t datatype defin
6dc0: 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20  ition extracted 
6dd0: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67  from the.** orig
6de0: 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c  inal CREATE TABL
6df0: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74  E statement if t
6e00: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
6e10: 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a   a column. The.*
6e20: 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  * declaration ty
6e30: 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66  pe for a ROWID f
6e40: 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e  ield is INTEGER.
6e50: 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e   Exactly when an
6e60: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
6e70: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  s considered a c
6e80: 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d  olumn can be com
6e90: 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73  plex in the pres
6ea0: 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69  ence of subqueri
6eb0: 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c  es. The.** resul
6ec0: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
6ed0: 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   in all of the f
6ee0: 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20  ollowing SELECT 
6ef0: 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a  statements is .*
6f00: 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  * considered a c
6f10: 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75  olumn by this fu
6f20: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
6f30: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
6f40: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
6f50: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
6f60: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
6f70: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
6f80: 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53  ROM tbl);.**   S
6f90: 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28  ELECT abc FROM (
6fa0: 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62  SELECT col AS ab
6fb0: 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  c FROM tbl);.** 
6fc0: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
6fd0: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79  ion type for any
6fe0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65   expression othe
6ff0: 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20  r than a column 
7000: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  is NULL..*/.stat
7010: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
7020: 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20 4e 61 6d  olumnType(.  Nam
7030: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a  eContext *pNC, .
7040: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20    Expr *pExpr,. 
7050: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
7060: 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63 6f 6e 73  OriginDb,.  cons
7070: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69  t char **pzOrigi
7080: 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  nTab,.  const ch
7090: 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c  ar **pzOriginCol
70a0: 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  .){.  char const
70b0: 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 63   *zType = 0;.  c
70c0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
70d0: 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72  inDb = 0;.  char
70e0: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 54   const *zOriginT
70f0: 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  ab = 0;.  char c
7100: 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 43 6f 6c  onst *zOriginCol
7110: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   = 0;.  int j;. 
7120: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c   if( pExpr==0 ||
7130: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d   pNC->pSrcList==
7140: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
7150: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
7160: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
7170: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
7180: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
7190: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
71a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
71b0: 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20   column. Locate 
71c0: 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f  the table the co
71d0: 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  lumn is being.  
71e0: 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
71f0: 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e   from in NameCon
7200: 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54  text.pSrcList. T
7210: 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65  his table may be
7220: 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64   real.      ** d
7230: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
7240: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20   a subquery..   
7250: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
7260: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
7270: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
7280: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d   structure colum
7290: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
72a0: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  rom */.      Sel
72b0: 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20  ect *pS = 0;    
72c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
72d0: 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  ct the column is
72e0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
72f0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  */.      int iCo
7300: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
7310: 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  mn;  /* Index of
7320: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20   column in pTab 
7330: 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
7340: 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a  pNC && !pTab ){.
7350: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
7360: 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d  *pTabList = pNC-
7370: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20  >pSrcList;.     
7380: 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61     for(j=0;j<pTa
7390: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
73a0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
73b0: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
73c0: 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20  able;j++);.     
73d0: 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73     if( j<pTabLis
73e0: 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  t->nSrc ){.     
73f0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
7400: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
7410: 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20  .          pS = 
7420: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
7430: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
7440: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
7450: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
7460: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
7470: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
7480: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
7490: 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 0a 20 20     /* FIX ME:.  
74a0: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61        ** This ca
74b0: 6e 20 6f 63 63 75 72 73 20 69 66 20 79 6f 75 20  n occurs if you 
74c0: 68 61 76 65 20 73 6f 6d 65 74 68 69 6e 67 20 6c  have something l
74d0: 69 6b 65 20 22 53 45 4c 45 43 54 20 6e 65 77 2e  ike "SELECT new.
74e0: 78 3b 22 20 69 6e 73 69 64 65 0a 20 20 20 20 20  x;" inside.     
74f0: 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2e     ** a trigger.
7500: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
7510: 2c 20 69 66 20 79 6f 75 20 72 65 66 65 72 65 6e  , if you referen
7520: 63 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 22  ce the special "
7530: 6e 65 77 22 0a 20 20 20 20 20 20 20 20 2a 2a 20  new".        ** 
7540: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 72 65 73  table in the res
7550: 75 6c 74 20 73 65 74 20 6f 66 20 61 20 73 65 6c  ult set of a sel
7560: 65 63 74 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ect.  We do not 
7570: 68 61 76 65 20 61 20 67 6f 6f 64 20 77 61 79 0a  have a good way.
7580: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 66 69          ** to fi
7590: 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 74 61  nd the actual ta
75a0: 62 6c 65 20 74 79 70 65 2c 20 73 6f 20 63 61 6c  ble type, so cal
75b0: 6c 20 69 74 20 22 54 45 58 54 22 2e 20 20 54 68  l it "TEXT".  Th
75c0: 69 73 20 69 73 20 72 65 61 6c 6c 79 0a 20 20 20  is is really.   
75d0: 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e       ** somethin
75e0: 67 20 6f 66 20 61 20 62 75 67 2c 20 62 75 74 20  g of a bug, but 
75f0: 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f  I do not know ho
7600: 77 20 74 6f 20 66 69 78 20 69 74 2e 0a 20 20 20  w to fix it..   
7610: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
7620: 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 6f 65  ** This code doe
7630: 73 20 6e 6f 74 20 70 72 6f 64 75 63 65 20 74 68  s not produce th
7640: 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
7650: 20 2d 20 69 74 20 6a 75 73 74 20 70 72 65 76 65   - it just preve
7660: 6e 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  nts.        ** a
7670: 20 73 65 67 66 61 75 6c 74 2e 20 20 53 65 65 20   segfault.  See 
7680: 74 69 63 6b 65 74 20 23 31 32 32 39 2e 0a 20 20  ticket #1229..  
7690: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
76a0: 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54 22 3b   zType = "TEXT";
76b0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
76c0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
76d0: 73 73 65 72 74 28 20 70 54 61 62 20 29 3b 0a 20  ssert( pTab );. 
76e0: 20 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20       if( pS ){. 
76f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74         /* The "t
7700: 61 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c  able" is actuall
7710: 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  y a sub-select o
7720: 72 20 61 20 76 69 65 77 20 69 6e 20 74 68 65 20  r a view in the 
7730: 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20  FROM clause.    
7740: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45      ** of the SE
7750: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
7760: 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61  Return the decla
7770: 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20  ration type and 
7780: 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a  origin.        *
7790: 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72  * data for the r
77a0: 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e  esult-set column
77b0: 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
77c0: 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ct..        */. 
77d0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
77e0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70  =0 && iCol<pS->p
77f0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
7800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
7810: 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61  iCol is less tha
7820: 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
7830: 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75   expression requ
7840: 65 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  ests the.       
7850: 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74     ** rowid of t
7860: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72  he sub-select or
7870: 20 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72   view. This expr
7880: 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20  ession is legal 
7890: 28 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20  (see .          
78a0: 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73  ** test case mis
78b0: 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77  c2.2.2) - it alw
78c0: 61 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ays evaluates to
78d0: 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20   NULL..         
78e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61   */.          Na
78f0: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
7900: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
7910: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
7920: 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20  [iCol].pExpr;.  
7930: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63          sNC.pSrc
7940: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
7950: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
7960: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
7970: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
7980: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
7990: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
79a0: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
79b0: 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20   p, &zOriginDb, 
79c0: 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f  &zOriginTab, &zO
79d0: 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20  riginCol); .    
79e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
79f0: 65 20 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68  e if( pTab->pSch
7a00: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ema ){.        /
7a10: 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a  * A real table *
7a20: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
7a30: 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20  ( !pS );.       
7a40: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
7a50: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
7a60: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
7a70: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
7a80: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
7a90: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
7aa0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
7ab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
7ac0: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
7ad0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
7ae0: 69 6e 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b  inCol = "rowid";
7af0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
7b00: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
7b10: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
7b20: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20  l].zType;.      
7b30: 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d      zOriginCol =
7b40: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
7b50: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
7b60: 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67   }.        zOrig
7b70: 69 6e 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e  inTab = pTab->zN
7b80: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
7b90: 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a   pNC->pParse ){.
7ba0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
7bb0: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
7bc0: 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50  aToIndex(pNC->pP
7bd0: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
7be0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
7bf0: 20 20 20 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20      zOriginDb = 
7c00: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  pNC->pParse->db-
7c10: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
7c20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7c30: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7c40: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
7c50: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
7c60: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
7c70: 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f  ELECT: {.      /
7c80: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
7c90: 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74   is a sub-select
7ca0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
7cb0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
7cc0: 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69  d.      ** origi
7cd0: 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73  n info for the s
7ce0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  ingle column in 
7cf0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
7d00: 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20  f the SELECT.   
7d10: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e     ** statement.
7d20: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
7d30: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
7d40: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
7d50: 53 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  S = pExpr->pSele
7d60: 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ct;.      Expr *
7d70: 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  p = pS->pEList->
7d80: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
7d90: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
7da0: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
7db0: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
7dc0: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72  ;.      sNC.pPar
7dd0: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
7de0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  ;.      zType = 
7df0: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
7e00: 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20   p, &zOriginDb, 
7e10: 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f  &zOriginTab, &zO
7e20: 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20  riginCol); .    
7e30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
7e40: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 69  endif.  }.  .  i
7e50: 66 28 20 70 7a 4f 72 69 67 69 6e 44 62 20 29 7b  f( pzOriginDb ){
7e60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f  .    assert( pzO
7e70: 72 69 67 69 6e 54 61 62 20 26 26 20 70 7a 4f 72  riginTab && pzOr
7e80: 69 67 69 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 2a  iginCol );.    *
7e90: 70 7a 4f 72 69 67 69 6e 44 62 20 3d 20 7a 4f 72  pzOriginDb = zOr
7ea0: 69 67 69 6e 44 62 3b 0a 20 20 20 20 2a 70 7a 4f  iginDb;.    *pzO
7eb0: 72 69 67 69 6e 54 61 62 20 3d 20 7a 4f 72 69 67  riginTab = zOrig
7ec0: 69 6e 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  inTab;.    *pzOr
7ed0: 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67 69  iginCol = zOrigi
7ee0: 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nCol;.  }.  retu
7ef0: 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zType;.}../*.
7f00: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
7f10: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
7f20: 74 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63  the VDBE the dec
7f30: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f  laration types o
7f40: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
7f50: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
7f60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
7f70: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
7f80: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
7f90: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
7fa0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
7fb0: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
7fc0: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
7fd0: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
7fe0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
7ff0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
8000: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
8010: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66  lt set */.){.#if
8020: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8030: 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65  _DECLTYPE.  Vdbe
8040: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
8050: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
8060: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
8070: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
8080: 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e  = pTabList;.  sN
8090: 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
80a0: 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  e;.  for(i=0; i<
80b0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
80c0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
80d0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
80e0: 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74  pExpr;.    const
80f0: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69   char *zType;.#i
8100: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8110: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
8120: 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  TA.    const cha
8130: 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  r *zOrigDb = 0;.
8140: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
8150: 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20  zOrigTab = 0;.  
8160: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
8170: 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  rigCol = 0;.    
8180: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
8190: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
81a0: 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c  igDb, &zOrigTab,
81b0: 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20   &zOrigCol);..  
81c0: 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75    /* The vdbe mu
81d0: 73 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20  st make its own 
81e0: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  copy of the colu
81f0: 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65  mn-type and othe
8200: 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  r .    ** column
8210: 20 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67   specific string
8220: 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  s, in case the s
8230: 63 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62  chema is reset b
8240: 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a  efore this.    *
8250: 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
8260: 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20  e is deleted..  
8270: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
8280: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8290: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54  , i, COLNAME_DAT
82a0: 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20  ABASE, zOrigDb, 
82b0: 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  P4_TRANSIENT);. 
82c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
82d0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
82e0: 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f  OLNAME_TABLE, zO
82f0: 72 69 67 54 61 62 2c 20 50 34 5f 54 52 41 4e 53  rigTab, P4_TRANS
8300: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
8310: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
8320: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43  (v, i, COLNAME_C
8330: 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c  OLUMN, zOrigCol,
8340: 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a   P4_TRANSIENT);.
8350: 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20  #else.    zType 
8360: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
8370: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  C, p, 0, 0, 0);.
8380: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
8390: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
83a0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44  (v, i, COLNAME_D
83b0: 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20  ECLTYPE, zType, 
83c0: 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  P4_TRANSIENT);. 
83d0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
83e0: 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
83f0: 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  E */.}../*.** Ge
8400: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
8410: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
8420: 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  DBE the names of
8430: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
8440: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
8450: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
8460: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76   is used to prov
8470: 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c  ide the.** azCol
8480: 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  [] values in the
8490: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   callback..*/.st
84a0: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
84b0: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20  teColumnNames(. 
84c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
84d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
84e0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
84f0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
8500: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
8510: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
8520: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
8530: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
8540: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
8550: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
8560: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
8570: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  e;.  int i, j;. 
8580: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8590: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
85a0: 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72   fullNames, shor
85b0: 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66  tNames;..#ifndef
85c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
85d0: 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69  LAIN.  /* If thi
85e0: 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c  s is an EXPLAIN,
85f0: 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20   skip this step 
8600: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
8610: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
8620: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
8630: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21  if..  assert( v!
8640: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  =0 );.  if( pPar
8650: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
8660: 7c 7c 20 76 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  || v==0 || db->m
8670: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
8680: 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e  turn;.  pParse->
8690: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
86a0: 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28  .  fullNames = (
86b0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
86c0: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
86d0: 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65  !=0;.  shortName
86e0: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
86f0: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
8700: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c  Names)!=0;.  sql
8710: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
8720: 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  ls(v, pEList->nE
8730: 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  xpr);.  for(i=0;
8740: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
8750: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
8760: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c   *p;.    p = pEL
8770: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
8780: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
8790: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
87a0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
87b0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Name ){.      ch
87c0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
87d0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
87e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
87f0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8800: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
8810: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
8820: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e  ame));.      con
8830: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
8840: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
8850: 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73  OLUMN && pTabLis
8860: 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  t ){.      Table
8870: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68   *pTab;.      ch
8880: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
8890: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
88a0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72  olumn;.      for
88b0: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74  (j=0; j<pTabList
88c0: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
88d0: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
88e0: 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b  !=p->iTable; j++
88f0: 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74  ){}.      assert
8900: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
8910: 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rc );.      pTab
8920: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
8930: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ].pTab;.      if
8940: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
8950: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
8960: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
8970: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
8980: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
8990: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
89a0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
89b0: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
89c0: 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
89d0: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
89e0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
89f0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
8a00: 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72  .      if( !shor
8a10: 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e  tNames && !fullN
8a20: 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e  ames && p->span.
8a30: 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30  z && p->span.z[0
8a40: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
8a50: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
8a60: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
8a70: 5f 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d  _NAME, (char*)p-
8a80: 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e  >span.z, p->span
8a90: 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .n);.      }else
8aa0: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c   if( fullNames |
8ab0: 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20 26  | (!shortNames &
8ac0: 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  & pTabList->nSrc
8ad0: 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >1) ){.        c
8ae0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
8af0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
8b00: 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54  ab;. .        zT
8b10: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
8b20: 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  [j].zAlias;.    
8b30: 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65      if( fullName
8b40: 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a  s || zTab==0 ) z
8b50: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
8b60: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
8b70: 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61  e3SetString(&zNa
8b80: 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a  me, zTab, ".", z
8b90: 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Col, (char*)0);.
8ba0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8bb0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8bc0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
8bd0: 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41  , zName, P4_DYNA
8be0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
8bf0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
8c00: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
8c10: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
8c20: 41 4d 45 2c 20 7a 43 6f 6c 2c 20 73 74 72 6c 65  AME, zCol, strle
8c30: 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20  n(zCol));.      
8c40: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
8c50: 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e  p->span.z && p->
8c60: 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  span.z[0] ){.   
8c70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8c80: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
8c90: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68  OLNAME_NAME, (ch
8ca0: 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70  ar*)p->span.z, p
8cb0: 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20  ->span.n);.     
8cc0: 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43   /* sqlite3VdbeC
8cd0: 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c 20  ompressSpace(v, 
8ce0: 61 64 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65  addr); */.    }e
8cf0: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
8d00: 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20  zName[30];.     
8d10: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
8d20: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61  TK_COLUMN || pTa
8d30: 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  bList==0 );.    
8d40: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8d50: 74 66 28 73 69 7a 65 6f 66 28 7a 4e 61 6d 65 29  tf(sizeof(zName)
8d60: 2c 20 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e  , zName, "column
8d70: 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  %d", i+1);.     
8d80: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8d90: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8da0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
8db0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
8dc0: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
8dd0: 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54  Types(pParse, pT
8de0: 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
8df0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
8e00: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
8e10: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61  _SELECT./*.** Na
8e20: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  me of the connec
8e30: 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75  tion operator, u
8e40: 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  sed for error me
8e50: 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssages..*/.stati
8e60: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65  c const char *se
8e70: 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69  lectOpName(int i
8e80: 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  d){.  char *z;. 
8e90: 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20   switch( id ){. 
8ea0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
8eb0: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
8ec0: 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a   ALL";   break;.
8ed0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
8ee0: 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45  RSECT: z = "INTE
8ef0: 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b  RSECT";   break;
8f00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
8f10: 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43  EPT:    z = "EXC
8f20: 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  EPT";      break
8f30: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
8f40: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e           z = "UN
8f50: 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61  ION";       brea
8f60: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
8f70: 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  z;.}.#endif /* S
8f80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
8f90: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f  UND_SELECT */../
8fa0: 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63  *.** Forward dec
8fb0: 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  laration.*/.stat
8fc0: 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63  ic int prepSelec
8fd0: 74 53 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65  tStmt(Parse*, Se
8fe0: 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47  lect*);../*.** G
8ff0: 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74  iven a SELECT st
9000: 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74  atement, generat
9010: 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  e a Table struct
9020: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
9030: 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  es.** the result
9040: 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c   set of that SEL
9050: 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ECT..*/.Table *s
9060: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
9070: 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  fSelect(Parse *p
9080: 50 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61  Parse, char *zTa
9090: 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70  bName, Select *p
90a0: 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
90b0: 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c   *pTab;.  int i,
90c0: 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   j;.  ExprList *
90d0: 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e  pEList;.  Column
90e0: 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 20   *aCol, *pCol;. 
90f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9100: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 77 68  Parse->db;..  wh
9110: 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50  ile( pSelect->pP
9120: 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d  rior ) pSelect =
9130: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
9140: 3b 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65  ;.  if( prepSele
9150: 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70  ctStmt(pParse, p
9160: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72  Select) ){.    r
9170: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
9180: 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
9190: 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20  Resolve(pParse, 
91a0: 70 53 65 6c 65 63 74 2c 20 30 29 20 29 7b 0a 20  pSelect, 0) ){. 
91b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
91c0: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
91d0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
91e0: 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  , sizeof(Table) 
91f0: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
9200: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
9210: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 6e 52  ;.  }.  pTab->nR
9220: 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e  ef = 1;.  pTab->
9230: 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65  zName = zTabName
9240: 20 3f 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   ? sqlite3DbStrD
9250: 75 70 28 64 62 2c 20 7a 54 61 62 4e 61 6d 65 29  up(db, zTabName)
9260: 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d   : 0;.  pEList =
9270: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
9280: 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d  ;.  pTab->nCol =
9290: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
92a0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
92b0: 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62  nCol>0 );.  pTab
92c0: 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20  ->aCol = aCol = 
92d0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
92e0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 70  ero(db, sizeof(p
92f0: 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54  Tab->aCol[0])*pT
9300: 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 66 6f 72  ab->nCol);.  for
9310: 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b  (i=0, pCol=aCol;
9320: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
9330: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
9340: 20 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a 20   Expr *p, *pR;. 
9350: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a     char *zType;.
9360: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
9370: 0a 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  .    int nName;.
9380: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
9390: 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 3b  ll;.    int cnt;
93a0: 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
93b0: 20 73 4e 43 3b 0a 20 20 20 20 0a 20 20 20 20 2f   sNC;.    .    /
93c0: 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72  * Get an appropr
93d0: 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  iate name for th
93e0: 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a  e column.    */.
93f0: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
9400: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
9410: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
9420: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68  t==0 || p->pRigh
9430: 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c  t->token.z==0 ||
9440: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
9450: 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  n.z[0]!=0 );.   
9460: 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45   if( (zName = pE
9470: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
9480: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
9490: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   If the column c
94a0: 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c  ontains an "AS <
94b0: 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75  name>" phrase, u
94c0: 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65  se <name> as the
94d0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a   name */.      z
94e0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
94f0: 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65  StrDup(db, zName
9500: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
9510: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a   p->op==TK_DOT .
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
9530: 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74 29 21   (pR=p->pRight)!
9540: 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e  =0 && pR->token.
9550: 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a  z && pR->token.z
9560: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  [0] ){.      /* 
9570: 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  For columns of t
9580: 68 65 20 66 72 6f 6d 20 41 2e 42 20 75 73 65 20  he from A.B use 
9590: 42 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  B as the name */
95a0: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
95b0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
95c0: 2c 20 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b  , "%T", &pR->tok
95d0: 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  en);.    }else i
95e0: 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  f( p->span.z && 
95f0: 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a  p->span.z[0] ){.
9600: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65        /* Use the
9610: 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f   original text o
9620: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70  f the column exp
9630: 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e  ression as its n
9640: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61  ame */.      zNa
9650: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
9660: 6e 74 66 28 64 62 2c 20 22 25 54 22 2c 20 26 70  ntf(db, "%T", &p
9670: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c  ->span);.    }el
9680: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  se{.      /* If 
9690: 61 6c 6c 20 65 6c 73 65 20 66 61 69 6c 73 2c 20  all else fails, 
96a0: 6d 61 6b 65 20 75 70 20 61 20 6e 61 6d 65 20 2a  make up a name *
96b0: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
96c0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
96d0: 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  b, "column%d", i
96e0: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  +1);.    }.    i
96f0: 66 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 64 62 2d  f( !zName || db-
9700: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
9710: 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  .      db->mallo
9720: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
9730: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9740: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
9750: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
9760: 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 72 65  (pTab);.      re
9770: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
9780: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
9790: 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a  (zName);..    /*
97a0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
97b0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e  olumn name is un
97c0: 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61  ique.  If the na
97d0: 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65  me is not unique
97e0: 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20  ,.    ** append 
97f0: 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65  a integer to the
9800: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74   name so that it
9810: 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e   becomes unique.
9820: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d  .    */.    nNam
9830: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
9840: 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74  );.    for(j=cnt
9850: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
9860: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9870: 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e  StrICmp(aCol[j].
9880: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
9890: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   ){.        zNam
98a0: 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20  e[nName] = 0;.  
98b0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
98c0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
98d0: 20 22 25 7a 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c   "%z:%d", zName,
98e0: 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20   ++cnt);.       
98f0: 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   j = -1;.       
9900: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
9910: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9920: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a     }.    pCol->z
9930: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20  Name = zName;.. 
9940: 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 74 79     /* Get the ty
9950: 70 65 6e 61 6d 65 2c 20 74 79 70 65 20 61 66 66  pename, type aff
9960: 69 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c 6c 61  inity, and colla
9970: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
9980: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c  r the.    ** col
9990: 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  umn..    */.    
99a0: 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
99b0: 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
99c0: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
99d0: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
99e0: 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69      zType = sqli
99f0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
9a00: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
9a10: 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a 20   p, 0, 0, 0));. 
9a20: 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d     pCol->zType =
9a30: 20 7a 54 79 70 65 3b 0a 20 20 20 20 70 43 6f 6c   zType;.    pCol
9a40: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
9a50: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
9a60: 28 70 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  (p);.    pColl =
9a70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
9a80: 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
9a90: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
9aa0: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f  .      pCol->zCo
9ab0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ll = sqlite3DbSt
9ac0: 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e  rDup(db, pColl->
9ad0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
9ae0: 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20  }.  pTab->iPKey 
9af0: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  = -1;.  return p
9b00: 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  Tab;.}../*.** Pr
9b10: 65 70 61 72 65 20 61 20 53 45 4c 45 43 54 20 73  epare a SELECT s
9b20: 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f  tatement for pro
9b30: 63 65 73 73 69 6e 67 20 62 79 20 64 6f 69 6e 67  cessing by doing
9b40: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
9b50: 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20  * things:.**.** 
9b60: 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72     (1)  Make sur
9b70: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
9b80: 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
9b90: 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72  assigned to ever
9ba0: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65  y.**         ele
9bb0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  ment of the FROM
9bc0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
9bd0: 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74    (2)  Fill in t
9be0: 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
9bf0: 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
9c00: 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
9c10: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
9c20: 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  ines FROM clause
9c30: 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70  .  When views ap
9c40: 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
9c50: 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20   clause,.**     
9c60: 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
9c70: 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
9c80: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
9c90: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
9ca0: 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
9cb0: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
9cc0: 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
9cd0: 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
9ce0: 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
9cf0: 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
9d00: 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
9d10: 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
9d20: 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
9d30: 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
9d40: 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
9d50: 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
9d60: 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74  g up the presist
9d70: 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
9d80: 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
9d90: 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
9da0: 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72      (3)  Add ter
9db0: 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
9dc0: 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f  clause to accomo
9dd0: 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c  date the NATURAL
9de0: 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20   keyword.**     
9df0: 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64      on joins and
9e00: 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
9e10: 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e  G clause of join
9e20: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20  s..**.**    (4) 
9e30: 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f   Scan the list o
9e40: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
9e50: 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c   result set (pEL
9e60: 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20  ist) looking.** 
9e70: 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74          for inst
9e80: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22  ances of the "*"
9e90: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65   operator or the
9ea0: 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f   TABLE.* operato
9eb0: 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66  r..**         If
9ec0: 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65   found, expand e
9ed0: 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76  ach "*" to be ev
9ee0: 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76  ery column in ev
9ef0: 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  ery table.**    
9f00: 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a       and TABLE.*
9f10: 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
9f20: 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a  umn in TABLE..**
9f30: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20  .** Return 0 on 
9f40: 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
9f50: 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c  re are problems,
9f60: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
9f70: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
9f80: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
9f90: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  non-zero..*/.sta
9fa0: 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65  tic int prepSele
9fb0: 63 74 53 74 6d 74 28 50 61 72 73 65 20 2a 70 50  ctStmt(Parse *pP
9fc0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
9fd0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c  {.  int i, j, k,
9fe0: 20 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   rc;.  SrcList *
9ff0: 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
a000: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
a010: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
a020: 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71  tem *pFrom;.  sq
a030: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a040: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
a050: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d  ==0 || p->pSrc==
a060: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
a070: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
a080: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 1;.  }.  pTa
a090: 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
a0a0: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
a0b0: 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  EList;..  /* Mak
a0c0: 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
a0d0: 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
a0e0: 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
a0f0: 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
a100: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
a110: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
a120: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
a130: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
a140: 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
a150: 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 0a 20  se, p->pSrc);.. 
a160: 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
a170: 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
a180: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
a190: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
a1a0: 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
a1b0: 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
a1c0: 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
a1d0: 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
a1e0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
a1f0: 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
a200: 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
a210: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
a220: 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
a230: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
a240: 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
a250: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
a260: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
a270: 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
a280: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69  ble *pTab;.    i
a290: 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  f( pFrom->pTab!=
a2a0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
a2b0: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  is statement has
a2c0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
a2d0: 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69  epared.  There i
a2e0: 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20  s no need.      
a2f0: 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72  ** to go further
a300: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
a310: 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( i==0 );.     
a320: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
a330: 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
a340: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e  zName==0 ){.#ifn
a350: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a360: 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 2f  SUBQUERY.      /
a370: 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
a380: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
a390: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
a3a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
a3b0: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  rom->pSelect!=0 
a3c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72  );.      if( pFr
a3d0: 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b  om->zAlias==0 ){
a3e0: 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
a3f0: 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20 20 20 20  zAlias =.       
a400: 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
a410: 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 75  f(db, "sqlite_su
a420: 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f  bquery_%p_", (vo
a430: 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  id*)pFrom->pSele
a440: 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
a450: 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
a460: 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
a470: 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
a480: 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
a490: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
a4a0: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
a4b0: 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c  , pFrom->zAlias,
a4c0: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
a4d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
a4e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
a4f0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
a500: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73  .      /* The is
a510: 45 70 68 65 6d 20 66 6c 61 67 20 69 6e 64 69 63  Ephem flag indic
a520: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 54 61  ates that the Ta
a530: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 61  ble structure ha
a540: 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a 20  s been.      ** 
a550: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
a560: 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20 62 65  cated and may be
a570: 20 66 72 65 65 64 20 61 74 20 61 6e 79 20 74 69   freed at any ti
a580: 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  me.  In other wo
a590: 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70 54  rds,.      ** pT
a5a0: 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  ab is not pointi
a5b0: 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73 74 65  ng to a persiste
a5c0: 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
a5d0: 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 0a  re that defines.
a5e0: 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f 66        ** part of
a5f0: 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a   the schema. */.
a600: 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73 45 70        pTab->isEp
a610: 68 65 6d 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  hem = 1;.#endif.
a620: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a630: 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
a640: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
a650: 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
a660: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
a670: 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
a680: 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
a690: 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
a6a0: 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
a6b0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
a6c0: 70 50 61 72 73 65 2c 30 2c 70 46 72 6f 6d 2d 3e  pParse,0,pFrom->
a6d0: 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61  zName,pFrom->zDa
a6e0: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69  tabase);.      i
a6f0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
a700: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
a710: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
a720: 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20  ab->nRef++;.#if 
a730: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a740: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
a750: 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f  efined (SQLITE_O
a760: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
a770: 29 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ).      if( pTab
a780: 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56  ->pSelect || IsV
a790: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
a7a0: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65          /* We re
a7b0: 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20  ach here if the 
a7c0: 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61  named table is a
a7d0: 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a   really a view *
a7e0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
a7f0: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
a800: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
a810: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
a820: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
a830: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
a840: 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  * If pFrom->pSel
a850: 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20  ect!=0 it means 
a860: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
a870: 69 74 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a  ith a.        **
a880: 20 76 69 65 77 20 77 69 74 68 69 6e 20 61 20 76   view within a v
a890: 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54  iew.  The SELECT
a8a0: 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20 61   structure has a
a8b0: 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20  lready been.    
a8c0: 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79      ** copied by
a8d0: 20 74 68 65 20 6f 75 74 65 72 20 76 69 65 77 20   the outer view 
a8e0: 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74  so we can skip t
a8f0: 68 65 20 63 6f 70 79 20 73 74 65 70 20 68 65 72  he copy step her
a900: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  e.        ** in 
a910: 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a  the inner view..
a920: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
a930: 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 53     if( pFrom->pS
a940: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
a950: 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65        pFrom->pSe
a960: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
a970: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
a980: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
a990: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
a9a0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ndif.    }.  }..
a9b0: 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
a9c0: 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
a9d0: 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
a9e0: 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
a9f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
aa00: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
aa10: 50 61 72 73 65 2c 20 70 29 20 29 20 72 65 74 75  Parse, p) ) retu
aa20: 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  rn 1;..  /* For 
aa30: 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f  every "*" that o
aa40: 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c  ccurs in the col
aa50: 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74  umn list, insert
aa60: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20   the names of.  
aa70: 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  ** all columns i
aa80: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41  n all tables.  A
aa90: 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42  nd for every TAB
aaa0: 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20  LE.* insert the 
aab0: 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c  names.  ** of al
aac0: 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42  l columns in TAB
aad0: 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  LE.  The parser 
aae0: 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69  inserted a speci
aaf0: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  al expression.  
ab00: 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41  ** with the TK_A
ab10: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  LL operator for 
ab20: 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74  each "*" that it
ab30: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f   found in the co
ab40: 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20  lumn list..  ** 
ab50: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
ab60: 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c  de just has to l
ab70: 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c  ocate the TK_ALL
ab80: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
ab90: 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63   expand.  ** eac
aba0: 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
abb0: 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
abc0: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a   in all tables..
abd0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
abe0: 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68  rst loop just ch
abf0: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
ac00: 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22  here are any "*"
ac10: 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20   operators.  ** 
ac20: 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64  that need expand
ac30: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
ac40: 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
ac50: 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
ac60: 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73  Expr *pE = pELis
ac70: 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
ac80: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
ac90: 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
aca0: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
acb0: 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69  K_DOT && pE->pRi
acc0: 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68  ght && pE->pRigh
acd0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20  t->op==TK_ALL.  
ace0: 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c         && pE->pL
acf0: 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  eft && pE->pLeft
ad00: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72  ->op==TK_ID ) br
ad10: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  eak;.  }.  rc = 
ad20: 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73  0;.  if( k<pELis
ad30: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
ad40: 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
ad50: 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
ad60: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
ad70: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
ad80: 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
ad90: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
ada0: 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
adb0: 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
adc0: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
add0: 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
ade0: 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
adf0: 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
ae00: 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
ae10: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
ae20: 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
ae30: 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
ae40: 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
ae50: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
ae60: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
ae70: 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e  s;.    int longN
ae80: 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20  ames = (flags & 
ae90: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
aea0: 6d 65 73 29 21 3d 30 20 26 26 0a 20 20 20 20 20  mes)!=0 &&.     
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aec0: 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
aed0: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d  _ShortColNames)=
aee0: 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30  =0;..    for(k=0
aef0: 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
af00: 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; k++){.      E
af10: 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70  xpr *pE = a[k].p
af20: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
af30: 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26  pE->op!=TK_ALL &
af40: 26 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 45  &.           (pE
af50: 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
af60: 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c  pE->pRight==0 ||
af70: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21   pE->pRight->op!
af80: 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20  =TK_ALL) ){.    
af90: 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
afa0: 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
afb0: 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
afc0: 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
afd0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
afe0: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
aff0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
b000: 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b  pParse, pNew, a[
b010: 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  k].pExpr, 0);.  
b020: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
b030: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
b040: 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
b050: 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e  1].zName = a[k].
b060: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
b070: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
b080: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
b090: 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  }.        a[k].p
b0a0: 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
b0b0: 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
b0c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b0d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65         /* This e
b0e0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22  xpression is a "
b0f0: 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a  *" or a "TABLE.*
b100: 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  " and needs to b
b110: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
b120: 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  anded. */.      
b130: 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20    int tableSeen 
b140: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74  = 0;      /* Set
b150: 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45   to 1 when TABLE
b160: 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
b170: 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65      char *zTName
b180: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b190: 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20  text of name of 
b1a0: 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20  TABLE */.       
b1b0: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
b1c0: 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  DOT && pE->pLeft
b1d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
b1e0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
b1f0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
b200: 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  &pE->pLeft->toke
b210: 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  n);.        }els
b220: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  e{.          zTN
b230: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
b240: 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69   }.        for(i
b250: 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
b260: 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
b270: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
b280: 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  rom++){.        
b290: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
b2a0: 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
b2b0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
b2c0: 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a  bName = pFrom->z
b2d0: 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
b2e0: 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
b2f0: 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d   || zTabName[0]=
b300: 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  =0 ){ .         
b310: 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54     zTabName = pT
b320: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
b330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b340: 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 28   if( zTName && (
b350: 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  zTabName==0 || z
b360: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c  TabName[0]==0 ||
b370: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
b380: 20 20 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d     sqlite3StrICm
b390: 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  p(zTName, zTabNa
b3a0: 6d 65 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  me)!=0) ){.     
b3b0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
b3c0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b3d0: 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e         tableSeen
b3e0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
b3f0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
b400: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
b410: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
b420: 45 78 70 72 2c 20 2a 70 52 69 67 68 74 3b 0a 20  Expr, *pRight;. 
b430: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
b440: 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61  *zName = pTab->a
b450: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20  Col[j].zName;.. 
b460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
b470: 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72   a column is mar
b480: 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 20  ked as 'hidden' 
b490: 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20  (currently only 
b4a0: 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
b4b0: 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74       ** for virt
b4c0: 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20  ual tables), do 
b4d0: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69  not include it i
b4e0: 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20  n the expanded. 
b4f0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65             ** re
b500: 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20  sult-set list.. 
b510: 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
b520: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73            if( Is
b530: 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54  HiddenColumn(&pT
b540: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a  ab->aCol[j]) ){.
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
b560: 73 65 72 74 28 49 73 56 69 72 74 75 61 6c 28 70  sert(IsVirtual(p
b570: 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Tab));.         
b580: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
b590: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
b5a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
b5b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
b5c0: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
b5d0: 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20  t_item *pLeft = 
b5e0: 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31  &pTabList->a[i-1
b5f0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
b600: 20 69 66 28 20 28 70 4c 65 66 74 5b 31 5d 2e 6a   if( (pLeft[1].j
b610: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
b620: 55 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20  URAL)!=0 &&.    
b630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b640: 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28      columnIndex(
b650: 70 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61  pLeft->pTab, zNa
b660: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
b670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
b680: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20  a NATURAL join, 
b690: 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f  omit the join co
b6a0: 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a  lumns from the .
b6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6c0: 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  ** table on the 
b6d0: 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20  right */.       
b6e0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
b6f0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
b700: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
b710: 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69   if( sqlite3IdLi
b720: 73 74 49 6e 64 65 78 28 70 4c 65 66 74 5b 31 5d  stIndex(pLeft[1]
b730: 2e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e  .pUsing, zName)>
b740: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
b750: 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f        /* In a jo
b760: 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20  in with a USING 
b770: 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c  clause, omit col
b780: 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20  umns in the.    
b790: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75              ** u
b7a0: 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d  sing clause from
b7b0: 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
b7c0: 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
b7e0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
b7f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b800: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
b810: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
b820: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
b830: 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  _ID, 0, 0, 0);. 
b840: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
b850: 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b  Right==0 ) break
b860: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ;.            se
b870: 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50 61  tQuotedToken(pPa
b880: 72 73 65 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f  rse, &pRight->to
b890: 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ken, zName);.   
b8a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
b8b0: 62 4e 61 6d 65 20 26 26 20 28 6c 6f 6e 67 4e 61  bName && (longNa
b8c0: 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d  mes || pTabList-
b8d0: 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20  >nSrc>1) ){.    
b8e0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
b8f0: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 50  pLeft = sqlite3P
b900: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
b910: 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ID, 0, 0, 0);.  
b920: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
b930: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
b940: 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
b950: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
b960: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
b970: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
b980: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
b990: 20 20 20 20 20 20 73 65 74 51 75 6f 74 65 64 54        setQuotedT
b9a0: 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 26 70 4c  oken(pParse, &pL
b9b0: 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62  eft->token, zTab
b9c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
b9d0: 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70       setToken(&p
b9e0: 45 78 70 72 2d 3e 73 70 61 6e 2c 20 0a 20 20 20  Expr->span, .   
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
ba00: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
ba10: 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e  , "%s.%s", zTabN
ba20: 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 20  ame, zName));.  
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
ba40: 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b  r->span.dyn = 1;
ba50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
ba60: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  Expr->token.z = 
ba70: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
ba80: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20   pExpr->token.n 
ba90: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
baa0: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
bab0: 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dyn = 0;.       
bac0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bad0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
bae0: 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
baf0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
bb00: 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b  pan = pExpr->tok
bb10: 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  en;.            
bb20: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79    pExpr->span.dy
bb30: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
bb40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
bb50: 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29   if( longNames )
bb60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
bb70: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
bb80: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
bb90: 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72  rse, pNew, pExpr
bba0: 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b  , &pExpr->span);
bbb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
bbc0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
bbd0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
bbe0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
bbf0: 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78  Parse, pNew, pEx
bc00: 70 72 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b  pr, &pRight->tok
bc10: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
bc20: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
bc30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bc40: 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
bc50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
bc60: 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20   zTName ){.     
bc70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
bc80: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
bc90: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
bca0: 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20  s", zTName);.   
bcb0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
bcc0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
bcd0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
bce0: 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65  , "no tables spe
bcf0: 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  cified");.      
bd00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
bd10: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
bd20: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
bd30: 33 5f 66 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a  3_free(zTName);.
bd40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bd50: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
bd60: 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b  tDelete(pEList);
bd70: 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  .    p->pEList =
bd80: 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53   pNew;.  }.#if S
bd90: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
bda0: 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
bdb0: 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   && p->pEList->n
bdc0: 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Expr>db->aLimit[
bdd0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
bde0: 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
bdf0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
be00: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
be10: 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
be20: 73 65 74 22 29 3b 0a 20 20 20 20 72 63 20 3d 20  set");.    rc = 
be30: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
be40: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 64  }.#endif.  if( d
be50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
be60: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
be70: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
be80: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
be90: 0a 2a 2a 20 70 45 20 69 73 20 61 20 70 6f 69 6e  .** pE is a poin
bea0: 74 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73  ter to an expres
beb0: 73 69 6f 6e 20 77 68 69 63 68 20 69 73 20 61 20  sion which is a 
bec0: 73 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 0a 2a  single term in.*
bed0: 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  * ORDER BY or GR
bee0: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  OUP BY clause..*
bef0: 2a 0a 2a 2a 20 49 66 20 70 45 20 65 76 61 6c 75  *.** If pE evalu
bf00: 61 74 65 73 20 74 6f 20 61 6e 20 69 6e 74 65 67  ates to an integ
bf10: 65 72 20 63 6f 6e 73 74 61 6e 74 20 69 2c 20 74  er constant i, t
bf20: 68 65 6e 20 72 65 74 75 72 6e 20 69 2e 0a 2a 2a  hen return i..**
bf30: 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 64 69   This is an indi
bf40: 63 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 61  cation to the ca
bf50: 6c 6c 65 72 20 74 68 61 74 20 69 74 20 73 68 6f  ller that it sho
bf60: 75 6c 64 20 73 6f 72 74 0a 2a 2a 20 62 79 20 74  uld sort.** by t
bf70: 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i-th column o
bf80: 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
bf90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 20 69 73  ..**.** If pE is
bfa0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 65   a well-formed e
bfb0: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 74 68  xpression and th
bfc0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
bfd0: 6e 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d  nt.** is not com
bfe0: 70 6f 75 6e 64 2c 20 74 68 65 6e 20 72 65 74 75  pound, then retu
bff0: 72 6e 20 30 2e 20 20 54 68 69 73 20 69 6e 64 69  rn 0.  This indi
c000: 63 61 74 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  cates to the.** 
c010: 63 61 6c 6c 65 72 20 74 68 61 74 20 69 74 20 73  caller that it s
c020: 68 6f 75 6c 64 20 73 6f 72 74 20 62 79 20 74 68  hould sort by th
c030: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4f  e value of the O
c040: 52 44 45 52 20 42 59 0a 2a 2a 20 65 78 70 72 65  RDER BY.** expre
c050: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssion..**.** If 
c060: 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 63 6f  the SELECT is co
c070: 6d 70 6f 75 6e 64 2c 20 74 68 65 6e 20 61 74 74  mpound, then att
c080: 65 6d 70 74 20 74 6f 20 6d 61 74 63 68 20 70 45  empt to match pE
c090: 20 61 67 61 69 6e 73 74 0a 2a 2a 20 72 65 73 75   against.** resu
c0a0: 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 69  lt set columns i
c0b0: 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  n the left-most 
c0c0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
c0d0: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
c0e0: 20 69 6e 64 65 78 20 69 20 6f 66 20 74 68 65 20   index i of the 
c0f0: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 2c  matching column,
c100: 20 61 73 20 61 6e 20 69 6e 64 69 63 61 74 69 6f   as an indicatio
c110: 6e 20 74 6f 20 74 68 65 20 0a 2a 2a 20 63 61 6c  n to the .** cal
c120: 6c 65 72 20 74 68 61 74 20 69 74 20 73 68 6f 75  ler that it shou
c130: 6c 64 20 73 6f 72 74 20 62 79 20 74 68 65 20 69  ld sort by the i
c140: 2d 74 68 20 63 6f 6c 75 6d 6e 2e 20 20 49 66 20  -th column.  If 
c150: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 6d  there is.** no m
c160: 61 74 63 68 2c 20 72 65 74 75 72 6e 20 2d 31 20  atch, return -1 
c170: 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72  and leave an err
c180: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
c190: 61 72 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  arse..*/.static 
c1a0: 69 6e 74 20 6d 61 74 63 68 4f 72 64 65 72 42 79  int matchOrderBy
c1b0: 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 0a  TermToExprList(.
c1c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c1d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
c1e0: 63 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f  context for erro
c1f0: 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20  r messages */.  
c200: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
c210: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
c220: 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20   statement with 
c230: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
c240: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  use */.  Expr *p
c250: 45 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  E,          /* T
c260: 68 65 20 73 70 65 63 69 66 69 63 20 4f 52 44 45  he specific ORDE
c270: 52 20 42 59 20 74 65 72 6d 20 2a 2f 0a 20 20 69  R BY term */.  i
c280: 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20  nt idx,         
c290: 20 20 2f 2a 20 57 68 65 6e 20 4f 52 44 45 52 20    /* When ORDER 
c2a0: 42 59 20 74 65 72 6d 20 69 73 20 74 68 69 73 20  BY term is this 
c2b0: 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6f  */.  int isCompo
c2c0: 75 6e 64 2c 20 20 20 20 2f 2a 20 54 72 75 65 20  und,    /* True 
c2d0: 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d  if this is a com
c2e0: 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a  pound SELECT */.
c2f0: 20 20 75 38 20 2a 70 48 61 73 41 67 67 20 20 20    u8 *pHasAgg   
c300: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
c310: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61  expression conta
c320: 69 6e 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ins aggregate fu
c330: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  nctions */.){.  
c340: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
c350: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
c360: 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  er */.  ExprList
c370: 20 2a 70 45 4c 69 73 74 3b 20 20 2f 2a 20 54 68   *pEList;  /* Th
c380: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
c390: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
c3a0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 6e 63 3b   NameContext nc;
c3b0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
c3c0: 65 78 74 20 66 6f 72 20 72 65 73 6f 6c 76 69 6e  ext for resolvin
c3d0: 67 20 70 45 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 49  g pE */...  /* I
c3e0: 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 6e  f the term is an
c3f0: 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   integer constan
c400: 74 2c 20 72 65 74 75 72 6e 20 74 68 65 20 76 61  t, return the va
c410: 6c 75 65 20 6f 66 20 74 68 61 74 0a 20 20 2a 2a  lue of that.  **
c420: 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 70   constant */.  p
c430: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
c440: 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 73  >pEList;.  if( s
c450: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
c460: 67 65 72 28 70 45 2c 20 26 69 29 20 29 7b 0a 20  ger(pE, &i) ){. 
c470: 20 20 20 69 66 28 20 69 3c 3d 30 20 29 7b 0a 20     if( i<=0 ){. 
c480: 20 20 20 20 20 2f 2a 20 49 66 20 69 20 69 73 20       /* If i is 
c490: 74 6f 6f 20 73 6d 61 6c 6c 2c 20 6d 61 6b 65 20  too small, make 
c4a0: 69 74 20 74 6f 6f 20 62 69 67 2e 20 20 54 68 61  it too big.  Tha
c4b0: 74 20 77 61 79 20 74 68 65 20 63 61 6c 6c 69 6e  t way the callin
c4c0: 67 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  g.      ** funct
c4d0: 69 6f 6e 20 73 74 69 6c 6c 20 73 65 65 73 20 61  ion still sees a
c4e0: 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 20 6f   value that is o
c4f0: 75 74 20 6f 66 20 72 61 6e 67 65 2c 20 62 75 74  ut of range, but
c500: 20 64 6f 65 73 0a 20 20 20 20 20 20 2a 2a 20 6e   does.      ** n
c510: 6f 74 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  ot confuse the c
c520: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74  olumn number wit
c530: 68 20 30 20 6f 72 20 2d 31 20 72 65 73 75 6c 74  h 0 or -1 result
c540: 20 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   code..      */.
c550: 20 20 20 20 20 20 69 20 3d 20 70 45 4c 69 73 74        i = pEList
c560: 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 7d  ->nExpr+1;.    }
c570: 0a 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20  .    return i;. 
c580: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
c590: 74 65 72 6d 20 69 73 20 61 20 73 69 6d 70 6c 65  term is a simple
c5a0: 20 69 64 65 6e 74 69 66 69 65 72 20 74 68 61 74   identifier that
c5b0: 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68   try to match th
c5c0: 61 74 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20  at identifier.  
c5d0: 2a 2a 20 61 67 61 69 6e 73 74 20 61 20 63 6f 6c  ** against a col
c5e0: 75 6d 6e 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  umn name in the 
c5f0: 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f  result set..  */
c600: 0a 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54  .  if( pE->op==T
c610: 4b 5f 49 44 20 7c 7c 20 28 70 45 2d 3e 6f 70 3d  K_ID || (pE->op=
c620: 3d 54 4b 5f 53 54 52 49 4e 47 20 26 26 20 70 45  =TK_STRING && pE
c630: 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 27 5c  ->token.z[0]!='\
c640: 27 27 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  '') ){.    sqlit
c650: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
c660: 3e 64 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  >db;.    char *z
c670: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  Col = sqlite3Nam
c680: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 26  eFromToken(db, &
c690: 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  pE->token);.    
c6a0: 69 66 28 20 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20  if( zCol==0 ){. 
c6b0: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
c6c0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
c6d0: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
c6e0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
c6f0: 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69  char *zAs = pELi
c700: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
c710: 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30        if( zAs!=0
c720: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
c730: 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30  mp(zAs, zCol)==0
c740: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
c750: 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 29 3b 0a  te3_free(zCol);.
c760: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69          return i
c770: 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +1;.      }.    
c780: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
c790: 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20  ee(zCol);.  }.. 
c7a0: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20   /* Resolve all 
c7b0: 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 4f 52 44  names in the ORD
c7c0: 45 52 20 42 59 20 74 65 72 6d 20 65 78 70 72 65  ER BY term expre
c7d0: 73 73 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  ssion.  */.  mem
c7e0: 73 65 74 28 26 6e 63 2c 20 30 2c 20 73 69 7a 65  set(&nc, 0, size
c7f0: 6f 66 28 6e 63 29 29 3b 0a 20 20 6e 63 2e 70 50  of(nc));.  nc.pP
c800: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
c810: 20 6e 63 2e 70 53 72 63 4c 69 73 74 20 3d 20 70   nc.pSrcList = p
c820: 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
c830: 6e 63 2e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69  nc.pEList = pELi
c840: 73 74 3b 0a 20 20 6e 63 2e 61 6c 6c 6f 77 41 67  st;.  nc.allowAg
c850: 67 20 3d 20 31 3b 0a 20 20 6e 63 2e 6e 45 72 72  g = 1;.  nc.nErr
c860: 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69   = 0;.  if( sqli
c870: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
c880: 6d 65 73 28 26 6e 63 2c 20 70 45 29 20 29 7b 0a  mes(&nc, pE) ){.
c890: 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6f 75      if( isCompou
c8a0: 6e 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nd ){.      sqli
c8b0: 74 65 33 45 72 72 6f 72 43 6c 65 61 72 28 70 50  te3ErrorClear(pP
c8c0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 65 74  arse);.      ret
c8d0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
c8e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  {.      return -
c8f0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  1;.    }.  }.  i
c900: 66 28 20 6e 63 2e 68 61 73 41 67 67 20 26 26 20  f( nc.hasAgg && 
c910: 70 48 61 73 41 67 67 20 29 7b 0a 20 20 20 20 2a  pHasAgg ){.    *
c920: 70 48 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d  pHasAgg = 1;.  }
c930: 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 6d  ..  /* For a com
c940: 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 77 65  pound SELECT, we
c950: 20 6e 65 65 64 20 74 6f 20 74 72 79 20 74 6f 20   need to try to 
c960: 6d 61 74 63 68 20 74 68 65 20 4f 52 44 45 52 20  match the ORDER 
c970: 42 59 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  BY.  ** expressi
c980: 6f 6e 20 61 67 61 69 6e 73 74 20 61 6e 20 65 78  on against an ex
c990: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
c9a0: 72 65 73 75 6c 74 20 73 65 74 0a 20 20 2a 2f 0a  result set.  */.
c9b0: 20 20 69 66 28 20 69 73 43 6f 6d 70 6f 75 6e 64    if( isCompound
c9c0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
c9d0: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
c9e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
c9f0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
ca00: 70 61 72 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69  pare(pEList->a[i
ca10: 5d 2e 70 45 78 70 72 2c 20 70 45 29 20 29 7b 0a  ].pExpr, pE) ){.
ca20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69          return i
ca30: 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +1;.      }.    
ca40: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
ca50: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  ;.}.../*.** Anal
ca60: 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59  yze and ORDER BY
ca70: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
ca80: 75 73 65 20 69 6e 20 61 20 73 69 6d 70 6c 65 20  use in a simple 
ca90: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
caa0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
cab0: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
cac0: 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 45 76 65   seen..**.** Eve
cad0: 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f  ry term of the O
cae0: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
caf0: 20 42 59 20 63 6c 61 75 73 65 20 6e 65 65 64 73   BY clause needs
cb00: 20 74 6f 20 62 65 20 61 6e 0a 2a 2a 20 65 78 70   to be an.** exp
cb10: 72 65 73 73 69 6f 6e 2e 20 20 49 66 20 61 6e 79  ression.  If any
cb20: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
cb30: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
cb40: 6e 74 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 61 74  nt, then.** that
cb50: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
cb60: 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 63  eplaced by the c
cb70: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 2a 2a  orresponding .**
cb80: 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
cb90: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
cba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
cbb0: 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70  rocessOrderGroup
cbc0: 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
cbd0: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
cbe0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20  arsing context. 
cbf0: 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73   Leave error mes
cc00: 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a 20 20  sages here */.  
cc10: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
cc20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
cc30: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  ECT statement co
cc40: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6c 61  ntaining the cla
cc50: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
cc60: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
cc70: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f  * The ORDER BY o
cc80: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
cc90: 65 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65  e to be processe
cca0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 72 64  d */.  int isOrd
ccb0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er,          /* 
ccc0: 31 20 66 6f 72 20 4f 52 44 45 52 20 42 59 2e 20  1 for ORDER BY. 
ccd0: 20 30 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20   0 for GROUP BY 
cce0: 2a 2f 0a 20 20 75 38 20 2a 70 48 61 73 41 67 67  */.  u8 *pHasAgg
ccf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
cd00: 74 20 74 6f 20 54 52 55 45 20 69 66 20 61 6e 79  t to TRUE if any
cd10: 20 74 65 72 6d 20 63 6f 6e 74 61 69 6e 73 20 61   term contains a
cd20: 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 29  n aggregate */.)
cd30: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
cd40: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
cd50: 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 4c 69 73  e->db;.  ExprLis
cd60: 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66  t *pEList;..  if
cd70: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ( pOrderBy==0 ||
cd80: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
cd90: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
cda0: 72 6e 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45  rn 0;.#if SQLITE
cdb0: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
cdc0: 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ( pOrderBy->nExp
cdd0: 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
cde0: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
cdf0: 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ] ){.    const c
ce00: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 69 73 4f  har *zType = isO
ce10: 72 64 65 72 20 3f 20 22 4f 52 44 45 52 22 20 3a  rder ? "ORDER" :
ce20: 20 22 47 52 4f 55 50 22 3b 0a 20 20 20 20 73 71   "GROUP";.    sq
ce30: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ce40: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
ce50: 74 65 72 6d 73 20 69 6e 20 25 73 20 42 59 20 63  terms in %s BY c
ce60: 6c 61 75 73 65 22 2c 20 7a 54 79 70 65 29 3b 0a  lause", zType);.
ce70: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
ce80: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 45 4c 69 73  }.#endif.  pELis
ce90: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
cea0: 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ist;.  if( pELis
ceb0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
cec0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
ced0: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
cee0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
cef0: 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
cf00: 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65  Expr *pE = pOrde
cf10: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
cf20: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 6d 61 74 63  .    iCol = matc
cf30: 68 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78  hOrderByTermToEx
cf40: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
cf50: 53 65 6c 65 63 74 2c 20 70 45 2c 20 69 2b 31 2c  Select, pE, i+1,
cf60: 20 30 2c 20 70 48 61 73 41 67 67 29 3b 0a 20 20   0, pHasAgg);.  
cf70: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
cf80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
cf90: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
cfa0: 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  ol>pEList->nExpr
cfb0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
cfc0: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 69 73  char *zType = is
cfd0: 4f 72 64 65 72 20 3f 20 22 4f 52 44 45 52 22 20  Order ? "ORDER" 
cfe0: 3a 20 22 47 52 4f 55 50 22 3b 0a 20 20 20 20 20  : "GROUP";.     
cff0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
d000: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
d010: 20 20 20 22 25 72 20 25 73 20 42 59 20 74 65 72     "%r %s BY ter
d020: 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d  m out of range -
d030: 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20   should be ".   
d040: 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31        "between 1
d050: 20 61 6e 64 20 25 64 22 2c 20 69 2b 31 2c 20 7a   and %d", i+1, z
d060: 54 79 70 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Type, pEList->nE
d070: 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  xpr);.      retu
d080: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
d090: 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20  if( iCol>0 ){.  
d0a0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
d0b0: 6c 6c 20 3d 20 70 45 2d 3e 70 43 6f 6c 6c 3b 0a  ll = pE->pColl;.
d0c0: 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
d0d0: 3d 20 70 45 2d 3e 66 6c 61 67 73 20 26 20 45 50  = pE->flags & EP
d0e0: 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  _ExpCollate;.   
d0f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
d100: 6c 65 74 65 28 70 45 29 3b 0a 20 20 20 20 20 20  lete(pE);.      
d110: 70 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pE = sqlite3Expr
d120: 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e  Dup(db, pEList->
d130: 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29  a[iCol-1].pExpr)
d140: 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ;.      pOrderBy
d150: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70  ->a[i].pExpr = p
d160: 45 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 20  E;.      if( pE 
d170: 26 26 20 70 43 6f 6c 6c 20 26 26 20 66 6c 61 67  && pColl && flag
d180: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 2d  s ){.        pE-
d190: 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  >pColl = pColl;.
d1a0: 20 20 20 20 20 20 20 20 70 45 2d 3e 66 6c 61 67          pE->flag
d1b0: 73 20 7c 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20  s |= flags;.    
d1c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
d1d0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
d1e0: 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20 4f  ** Analyze and O
d1f0: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
d200: 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20   BY clause in a 
d210: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d220: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
d230: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
d240: 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  s seen..**.** Th
d250: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 64 65 70  e processing dep
d260: 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20  ends on whether 
d270: 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 73 69  the SELECT is si
d280: 6d 70 6c 65 20 6f 72 20 63 6f 6d 70 6f 75 6e 64  mple or compound
d290: 2e 0a 2a 2a 20 46 6f 72 20 61 20 73 69 6d 70 6c  ..** For a simpl
d2a0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
d2b0: 6e 74 2c 20 65 76 72 79 20 74 65 72 6d 20 6f 66  nt, evry term of
d2c0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72   the ORDER BY or
d2d0: 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 63 6c 61   GROUP BY.** cla
d2e0: 75 73 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  use needs to be 
d2f0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  an expression.  
d300: 49 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  If any expressio
d310: 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 0a  n is an integer.
d320: 2a 2a 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65  ** constant, the
d330: 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  n that expressio
d340: 6e 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79  n is replaced by
d350: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
d360: 6e 67 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ng .** expressio
d370: 6e 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c  n from the resul
d380: 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  t set..**.** For
d390: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
d3a0: 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 65 76 65   statements, eve
d3b0: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 65  ry expression ne
d3c0: 65 64 73 20 74 6f 20 62 65 20 6f 66 0a 2a 2a 20  eds to be of.** 
d3d0: 74 79 70 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 77  type TK_COLUMN w
d3e0: 69 74 68 20 61 20 69 54 61 62 6c 65 20 76 61 6c  ith a iTable val
d3f0: 75 65 20 61 73 20 67 69 76 65 6e 20 69 6e 20 74  ue as given in t
d400: 68 65 20 34 74 68 20 70 61 72 61 6d 65 74 65 72  he 4th parameter
d410: 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 65 78 70 72  ..** If any expr
d420: 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74  ession is an int
d430: 65 67 65 72 2c 20 74 68 61 74 20 62 65 63 6f 6d  eger, that becom
d440: 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  es the column nu
d450: 6d 62 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  mber..** Otherwi
d460: 73 65 2c 20 6d 61 74 63 68 20 74 68 65 20 65 78  se, match the ex
d470: 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 73 74  pression against
d480: 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75   result set colu
d490: 6d 6e 73 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  mns from.** the 
d4a0: 6c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  left-most SELECT
d4b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d4c0: 70 72 6f 63 65 73 73 43 6f 6d 70 6f 75 6e 64 4f  processCompoundO
d4d0: 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
d4e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d4f0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
d500: 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72 6f 72  xt.  Leave error
d510: 20 6d 65 73 73 61 67 65 73 20 68 65 72 65 20 2a   messages here *
d520: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
d530: 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ect,      /* The
d540: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
d550: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
d560: 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 69   ORDER BY */.  i
d570: 6e 74 20 69 54 61 62 6c 65 20 20 20 20 20 20 20  nt iTable       
d580: 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74       /* Output t
d590: 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 6f 75 6e  able for compoun
d5a0: 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
d5b0: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
d5c0: 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  i;.  ExprList *p
d5d0: 4f 72 64 65 72 42 79 3b 0a 20 20 45 78 70 72 4c  OrderBy;.  ExprL
d5e0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
d5f0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
d600: 74 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a  t moreToDo = 1;.
d610: 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 53  .  pOrderBy = pS
d620: 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 3b  elect->pOrderBy;
d630: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d  .  if( pOrderBy=
d640: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
d650: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
d660: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
d670: 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 4f  _COLUMN.  if( pO
d680: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62  rderBy->nExpr>db
d690: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
d6a0: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
d6b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
d6c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
d6d0: 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20  o many terms in 
d6e0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 22  ORDER BY clause"
d6f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
d700: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f  .  }.#endif.  fo
d710: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
d720: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
d730: 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
d740: 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  i].done = 0;.  }
d750: 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63  .  while( pSelec
d760: 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  t->pPrior ){.   
d770: 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
d780: 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a  ct->pPrior;.  }.
d790: 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
d7a0: 20 26 26 20 6d 6f 72 65 54 6f 44 6f 20 29 7b 0a   && moreToDo ){.
d7b0: 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 30      moreToDo = 0
d7c0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
d7d0: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
d7e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
d7f0: 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  t iCol = -1;.   
d800: 20 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 44     Expr *pE, *pD
d810: 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  up;.      if( pO
d820: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
d830: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
d840: 20 20 20 20 70 45 20 3d 20 70 4f 72 64 65 72 42      pE = pOrderB
d850: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
d860: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
d870: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
d880: 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 64  E);.      if( !d
d890: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
d8a0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
d8b0: 74 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  t(pDup);.       
d8c0: 20 69 43 6f 6c 20 3d 20 6d 61 74 63 68 4f 72 64   iCol = matchOrd
d8d0: 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69  erByTermToExprLi
d8e0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
d8f0: 63 74 2c 20 70 44 75 70 2c 20 69 2b 31 2c 20 31  ct, pDup, i+1, 1
d900: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
d910: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
d920: 65 6c 65 74 65 28 70 44 75 70 29 3b 0a 20 20 20  elete(pDup);.   
d930: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
d940: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d950: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
d960: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
d970: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20  t->pEList;.     
d980: 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29   if( pEList==0 )
d990: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
d9a0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
d9b0: 20 20 69 66 28 20 69 43 6f 6c 3e 70 45 4c 69 73    if( iCol>pELis
d9c0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
d9d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d9e0: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
d9f0: 20 20 20 20 20 20 20 20 22 25 72 20 4f 52 44 45          "%r ORDE
da00: 52 20 42 59 20 74 65 72 6d 20 6f 75 74 20 6f 66  R BY term out of
da10: 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20   range - should 
da20: 62 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  be ".           
da30: 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25  "between 1 and %
da40: 64 22 2c 20 69 2b 31 2c 20 70 45 4c 69 73 74 2d  d", i+1, pEList-
da50: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >nExpr);.       
da60: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
da70: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f   }.      if( iCo
da80: 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  l>0 ){.        p
da90: 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  E->op = TK_COLUM
daa0: 4e 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 69  N;.        pE->i
dab0: 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a  Table = iTable;.
dac0: 20 20 20 20 20 20 20 20 70 45 2d 3e 69 41 67 67          pE->iAgg
dad0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 70   = -1;.        p
dae0: 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f  E->iColumn = iCo
daf0: 6c 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 45 2d  l-1;.        pE-
db00: 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20  >pTab = 0;.     
db10: 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
db20: 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  ].done = 1;.    
db30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
db40: 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 20   moreToDo = 1;. 
db50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
db60: 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
db70: 63 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  ct->pNext;.  }. 
db80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
db90: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
dba0: 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  ){.    if( pOrde
dbb0: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 3d 3d  rBy->a[i].done==
dbc0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
dbd0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
dbe0: 65 2c 20 22 25 72 20 4f 52 44 45 52 20 42 59 20  e, "%r ORDER BY 
dbf0: 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61  term does not ma
dc00: 74 63 68 20 61 6e 79 20 22 0a 20 20 20 20 20 20  tch any ".      
dc10: 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 20 69 6e        "column in
dc20: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 22   the result set"
dc30: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 72 65  , i+1);.      re
dc40: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
dc50: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
dc60: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42  ./*.** Get a VDB
dc70: 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  E for the given 
dc80: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20  parser context. 
dc90: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
dca0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
dcb0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
dcc0: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
dcd0: 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d  LL and leave a m
dce0: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
dcf0: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
dd00: 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20  e3GetVdbe(Parse 
dd10: 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
dd20: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
dd30: 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  dbe;.  if( v==0 
dd40: 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73  ){.    v = pPars
dd50: 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74  e->pVdbe = sqlit
dd60: 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61  e3VdbeCreate(pPa
dd70: 72 73 65 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65  rse->db);.#ifnde
dd80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
dd90: 41 43 45 0a 20 20 20 20 69 66 28 20 76 20 29 7b  ACE.    if( v ){
dda0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ddb0: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54  beAddOp0(v, OP_T
ddc0: 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  race);.    }.#en
ddd0: 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dif.  }.  return
dde0: 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   v;.}.../*.** Co
ddf0: 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74  mpute the iLimit
de00: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65   and iOffset fie
de10: 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  lds of the SELEC
de20: 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  T based on the.*
de30: 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  * pLimit and pOf
de40: 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73  fset expressions
de50: 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  .  pLimit and pO
de60: 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65  ffset hold the e
de70: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68  xpressions.** th
de80: 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  at appear in the
de90: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
dea0: 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68  atement after th
deb0: 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
dec0: 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20  ET.** keywords. 
ded0: 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73   Or NULL if thos
dee0: 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f  e keywords are o
def0: 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61  mitted. iLimit a
df00: 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61  nd iOffset .** a
df10: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d  re the integer m
df20: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e  emory register n
df30: 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74  umbers for count
df40: 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ers used to comp
df50: 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69  ute .** the limi
df60: 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49  t and offset.  I
df70: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69  f there is no li
df80: 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65  mit and/or offse
df90: 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d  t, then .** iLim
dfa0: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61  it and iOffset a
dfb0: 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  re negative..**.
dfc0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
dfd0: 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75  changes the valu
dfe0: 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64  es of iLimit and
dff0: 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66   iOffset only if
e000: 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f  .** a limit or o
e010: 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  ffset is defined
e020: 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70   by pLimit and p
e030: 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20  Offset.  iLimit 
e040: 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73  and.** iOffset s
e050: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
e060: 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70  preset to approp
e070: 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61  riate default va
e080: 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79  lues.** (usually
e090: 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20   but not always 
e0a0: 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  -1) prior to cal
e0b0: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
e0c0: 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c  e..** Only if pL
e0d0: 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73  imit!=0 or pOffs
e0e0: 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d  et!=0 do the lim
e0f0: 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74  it registers get
e100: 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20  .** redefined.  
e110: 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
e120: 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73  erator uses this
e130: 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72   property to for
e140: 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20  ce.** the reuse 
e150: 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69  of the same limi
e160: 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67  t and offset reg
e170: 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75  isters across mu
e180: 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54  ltiple.** SELECT
e190: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
e1a0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70  static void comp
e1b0: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
e1c0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
e1d0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
e1e0: 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20  iBreak){.  Vdbe 
e1f0: 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c  *v = 0;.  int iL
e200: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  imit = 0;.  int 
e210: 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61  iOffset;.  int a
e220: 64 64 72 31 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ddr1;..  /* .  *
e230: 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77  * "LIMIT -1" alw
e240: 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f  ays shows all ro
e250: 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f  ws.  There is so
e260: 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65  me.  ** contrave
e270: 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74  rsy about what t
e280: 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
e290: 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20  ior should be.. 
e2a0: 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   ** The current 
e2b0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
e2c0: 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54  nterprets "LIMIT
e2d0: 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a   0" to mean.  **
e2e0: 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20   no rows..  */. 
e2f0: 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
e300: 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20  {.    p->iLimit 
e310: 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61  = iLimit = ++pPa
e320: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76  rse->nMem;.    v
e330: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
e340: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
e350: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
e360: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
e370: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d  rCode(pParse, p-
e380: 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29  >pLimit, iLimit)
e390: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e3a0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
e3b0: 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29  stBeInt, iLimit)
e3c0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
e3d0: 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
e3e0: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 73 71 6c  nter"));.    sql
e3f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e400: 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69  , OP_IfZero, iLi
e410: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  mit, iBreak);.  
e420: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73  }.  if( p->pOffs
e430: 65 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4f 66  et ){.    p->iOf
e440: 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d  fset = iOffset =
e450: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
e460: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  .    if( p->pLim
e470: 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  it ){.      pPar
e480: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a  se->nMem++;   /*
e490: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74   Allocate an ext
e4a0: 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ra register for 
e4b0: 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a  limit+offset */.
e4c0: 20 20 20 20 7d 0a 20 20 20 20 76 20 3d 20 73 71      }.    v = sq
e4d0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
e4e0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
e4f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
e500: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e510: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66  (pParse, p->pOff
e520: 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  set, iOffset);. 
e530: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e540: 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
e550: 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a  eInt, iOffset);.
e560: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
e570: 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e  (v, "OFFSET coun
e580: 74 65 72 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ter"));.    addr
e590: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
e5a0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
e5b0: 73 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  s, iOffset);.   
e5c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e5d0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
e5e0: 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  , 0, iOffset);. 
e5f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
e600: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
e610: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69  ;.    if( p->pLi
e620: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  mit ){.      sql
e630: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
e640: 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74  , OP_Add, iLimit
e650: 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73  , iOffset, iOffs
e660: 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62  et+1);.      Vdb
e670: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
e680: 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20  MIT+OFFSET"));. 
e690: 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
e6a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
e6b0: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d  , OP_IfPos, iLim
e6c0: 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  it);.      sqlit
e6d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e6e0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20  OP_Integer, -1, 
e6f0: 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20  iOffset+1);.    
e700: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
e710: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
e720: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
e730: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 76  .** Allocate a v
e740: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20  irtual index to 
e750: 75 73 65 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e  use for sorting.
e760: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e770: 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64  createSortingInd
e780: 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
e790: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 45 78 70  , Select *p, Exp
e7a0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 29  rList *pOrderBy)
e7b0: 7b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  {.  if( pOrderBy
e7c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
e7d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
e7e0: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
e7f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 64 65  ==0 );.    pOrde
e800: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  rBy->iECursor = 
e810: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
e820: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
e830: 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
e840: 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4f  rse->pVdbe, OP_O
e850: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
e860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e870: 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72            pOrder
e880: 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f  By->iECursor, pO
e890: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 29  rderBy->nExpr+1)
e8a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
e8b0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
e8c0: 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 70 2d   == -1 );.    p-
e8d0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
e8e0: 20 3d 20 61 64 64 72 3b 0a 20 20 7d 0a 7d 0a 0a   = addr;.  }.}..
e8f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e900: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
e910: 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ECT./*.** Return
e920: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
e930: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
e940: 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  nce for the iCol
e950: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  -th column of.**
e960: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
e970: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
e980: 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e  -select statemen
e990: 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e  t "p".  Return N
e9a0: 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ULL if.** the co
e9b0: 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61  lumn has no defa
e9c0: 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ult collating se
e9d0: 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
e9e0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
e9f0: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  ence for the com
ea00: 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20  pound select is 
ea10: 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a  taken from the.*
ea20: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  * left-most term
ea30: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74   of the select t
ea40: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  hat has a collat
ea50: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ing sequence..*/
ea60: 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
ea70: 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c  *multiSelectColl
ea80: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
ea90: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
eaa0: 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53  t iCol){.  CollS
eab0: 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  eq *pRet;.  if( 
eac0: 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
ead0: 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
eae0: 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
eaf0: 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
eb00: 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol);.  }else{.  
eb10: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
eb20: 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b    if( pRet==0 ){
eb30: 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
eb40: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
eb50: 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
eb60: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29  ->a[iCol].pExpr)
eb70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
eb80: 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Ret;.}.#endif /*
eb90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
eba0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
ebb0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ebc0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
ebd0: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  LECT./*.** This 
ebe0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
ebf0: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 71  d to process a q
ec00: 75 65 72 79 20 74 68 61 74 20 69 73 20 72 65 61  uery that is rea
ec10: 6c 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a  lly the union.**
ec20: 20 6f 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e   or intersection
ec30: 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   of two or more 
ec40: 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73  separate queries
ec50: 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e  ..**.** "p" poin
ec60: 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ts to the right-
ec70: 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20  most of the two 
ec80: 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75  queries.  the qu
ec90: 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65  ery on the.** le
eca0: 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e  ft is p->pPrior.
ecb0: 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79    The left query
ecc0: 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61   could also be a
ecd0: 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a   compound query.
ece0: 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  ** in which case
ecf0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
ed00: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63  ll be called rec
ed10: 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a  ursively. .**.**
ed20: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
ed30: 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20  the total query 
ed40: 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65  are to be writte
ed50: 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61  n into a destina
ed60: 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20  tion.** of type 
ed70: 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d  eDest with param
ed80: 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  eter iParm..**.*
ed90: 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f  * Example 1:  Co
eda0: 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77  nsider a three-w
edb0: 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20  ay compound SQL 
edc0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
edd0: 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
ede0: 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t1 UNION SELE
edf0: 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49  CT b FROM t2 UNI
ee00: 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d  ON SELECT c FROM
ee10: 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73   t3.**.** This s
ee20: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
ee30: 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73  ed up as follows
ee40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
ee50: 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20  CT c FROM t3.** 
ee60: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60       |.**      `
ee70: 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62  ----->  SELECT b
ee80: 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20   FROM t2.**     
ee90: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60                 `
eeb0: 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  ------>  SELECT 
eec0: 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20  a FROM t1.**.** 
eed0: 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68  The arrows in th
eee0: 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20  e diagram above 
eef0: 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65  represent the Se
ef00: 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e  lect.pPrior poin
ef10: 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68  ter..** So if th
ef20: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
ef30: 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61  lled with p equa
ef40: 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72  l to the t3 quer
ef50: 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f  y, then.** pPrio
ef60: 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32  r will be the t2
ef70: 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77   query.  p->op w
ef80: 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20  ill be TK_UNION 
ef90: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
efa0: 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20  .** Notice that 
efb0: 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
efc0: 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73  ay SQLite parses
efd0: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
efe0: 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  s, the.** indivi
eff0: 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77  dual selects alw
f000: 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c  ays group from l
f010: 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f  eft to right..*/
f020: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
f030: 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  iSelect(.  Parse
f040: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
f050: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
f060: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
f070: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
f080: 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
f090: 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
f0a0: 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
f0b0: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
f0c0: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
f0d0: 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
f0e0: 6c 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  lts */.  char *a
f0f0: 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ff             /
f100: 2a 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52  * If eDest is SR
f110: 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66  T_Union, the aff
f120: 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a  inity string */.
f130: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
f140: 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75  LITE_OK;   /* Su
f150: 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20  ccess code from 
f160: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
f170: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
f180: 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
f190: 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
f1a0: 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
f1b0: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f1d0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
f1e0: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
f1f0: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
f200: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
f210: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
f220: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
f230: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
f240: 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f  erBy;   /* The O
f250: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
f260: 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20 61 53 65  n p */.  int aSe
f270: 74 50 32 5b 32 5d 3b 20 20 20 20 20 20 20 20 2f  tP2[2];        /
f280: 2a 20 53 65 74 20 50 32 20 76 61 6c 75 65 20 6f  * Set P2 value o
f290: 66 20 74 68 65 73 65 20 6f 70 20 74 6f 20 6e 75  f these op to nu
f2a0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
f2b0: 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 74 50 32 20  */.  int nSetP2 
f2c0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
f2d0: 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e  mber of slots in
f2e0: 20 61 53 65 74 50 32 5b 5d 20 75 73 65 64 20 2a   aSetP2[] used *
f2f0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
f300: 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74  est;      /* Alt
f310: 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65  ernative data de
f320: 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  stination */..  
f330: 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 0a  dest = *pDest;..
f340: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
f350: 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
f360: 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61   BY or LIMIT cla
f370: 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c  use on prior SEL
f380: 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a  ECTs.  Only.  **
f390: 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74   the last (right
f3a0: 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e  -most) SELECT in
f3b0: 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20   the series may 
f3c0: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
f3d0: 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a   or LIMIT..  */.
f3e0: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d    if( p==0 || p-
f3f0: 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20  >pPrior==0 ){.  
f400: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
f410: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
f420: 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f  end;.  }.  pPrio
f430: 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
f440: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
f450: 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72  >pRightmost!=pPr
f460: 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ior );.  assert(
f470: 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d   pPrior->pRightm
f480: 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f  ost==p->pRightmo
f490: 73 74 20 29 3b 0a 20 20 69 66 28 20 70 50 72 69  st );.  if( pPri
f4a0: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  or->pOrderBy ){.
f4b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f4c0: 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45  Msg(pParse,"ORDE
f4d0: 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75  R BY clause shou
f4e0: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
f4f0: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
f500: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
f510: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
f520: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
f530: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
f540: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f  .  }.  if( pPrio
f550: 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  r->pLimit ){.   
f560: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f570: 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63  (pParse,"LIMIT c
f580: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
f590: 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
f5a0: 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
f5b0: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
f5c0: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
f5d0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
f5e0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
f5f0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
f600: 65 20 68 61 76 65 20 61 20 76 61 6c 69 64 20 71  e have a valid q
f610: 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66  uery engine.  If
f620: 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e   not, create a n
f630: 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76  ew one..  */.  v
f640: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
f650: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
f660: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20   v==0 ){.    rc 
f670: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
f680: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
f690: 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65    }..  /* Create
f6a0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
f6b0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
f6c0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
f6d0: 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44  */.  if( dest.eD
f6e0: 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
f6f0: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
f700: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
f710: 20 20 61 73 73 65 72 74 28 20 6e 53 65 74 50 32    assert( nSetP2
f720: 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29 2f  <sizeof(aSetP2)/
f730: 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30 5d  sizeof(aSetP2[0]
f740: 29 20 29 3b 0a 20 20 20 20 61 53 65 74 50 32 5b  ) );.    aSetP2[
f750: 6e 53 65 74 50 32 2b 2b 5d 20 3d 20 73 71 6c 69  nSetP2++] = sqli
f760: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f770: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
f780: 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d 2c 20 30  l, dest.iParm, 0
f790: 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73  );.    dest.eDes
f7a0: 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20  t = SRT_Table;. 
f7b0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
f7c0: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c  e code for the l
f7d0: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45  eft and right SE
f7e0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
f7f0: 0a 20 20 2a 2f 0a 20 20 70 4f 72 64 65 72 42 79  .  */.  pOrderBy
f800: 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
f810: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
f820: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
f830: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  LL: {.      if( 
f840: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
f850: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
f860: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 73 73  = 0;.        ass
f870: 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c  ert( !pPrior->pL
f880: 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 20 20  imit );.        
f890: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d  pPrior->pLimit =
f8a0: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
f8b0: 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66      pPrior->pOff
f8c0: 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
f8d0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
f8e0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
f8f0: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
f900: 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  st, 0, 0, 0, aff
f910: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c  );.        p->pL
f920: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
f930: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
f940: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
f950: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
f960: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
f970: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
f980: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
f990: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
f9a0: 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72  >iLimit = pPrior
f9b0: 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
f9c0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
f9d0: 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
f9e0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69          if( p->i
f9f0: 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20  Limit>=0 ){.    
fa00: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
fa10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
fa20: 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e  , OP_IfZero, p->
fa30: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20  iLimit);.       
fa40: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
fa50: 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69  v, "Jump ahead i
fa60: 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22  f LIMIT reached"
fa70: 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
fa80: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
fa90: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
faa0: 20 70 2c 20 26 64 65 73 74 2c 20 30 2c 20 30 2c   p, &dest, 0, 0,
fab0: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
fac0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
fad0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66  rior;.        if
fae0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
faf0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
fb00: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
fb10: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 61   }.        if( a
fb20: 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ddr ){.         
fb30: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
fb40: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
fb50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fb60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
fb70: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49        /* For UNI
fb80: 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52  ON ALL ... ORDER
fb90: 20 42 59 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   BY fall through
fba0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73   to the next cas
fbb0: 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
fbc0: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20  ase TK_EXCEPT:. 
fbd0: 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
fbe0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e  : {.      int un
fbf0: 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75  ionTab;    /* Cu
fc00: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
fc10: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
fc20: 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  le holding resul
fc30: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f  t */.      int o
fc40: 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f  p = 0;      /* O
fc50: 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f  ne of the SRT_ o
fc60: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70  perations to app
fc70: 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20  ly to self */.  
fc80: 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b      int priorOp;
fc90: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f       /* The SRT_
fca0: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70   operation to ap
fcb0: 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c  ply to prior sel
fcc0: 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  ects */.      Ex
fcd0: 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
fce0: 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76  fset; /* Saved v
fcf0: 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d  alues of p->nLim
fd00: 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65  it and p->nOffse
fd10: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
fd20: 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  ddr;.      Selec
fd30: 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b  tDest uniondest;
fd40: 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20  ..      priorOp 
fd50: 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  = p->op==TK_ALL 
fd60: 3f 20 53 52 54 5f 54 61 62 6c 65 20 3a 20 53 52  ? SRT_Table : SR
fd70: 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69  T_Union;.      i
fd80: 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70  f( dest.eDest==p
fd90: 72 69 6f 72 4f 70 20 26 26 20 70 4f 72 64 65 72  riorOp && pOrder
fda0: 42 79 3d 3d 30 20 26 26 20 21 70 2d 3e 70 4c 69  By==0 && !p->pLi
fdb0: 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f 66 66 73  mit && !p->pOffs
fdc0: 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  et ){.        /*
fdd0: 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20   We can reuse a 
fde0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
fdf0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53  generated by a S
fe00: 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20  ELECT to our.   
fe10: 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20       ** right.. 
fe20: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
fe30: 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73    unionTab = des
fe40: 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  t.iParm;.      }
fe50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
fe60: 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
fe70: 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
fe80: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
fe90: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
fea0: 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
feb0: 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
fec0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
fed0: 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
fee0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
fef0: 20 20 20 69 66 28 20 70 72 6f 63 65 73 73 43 6f     if( processCo
ff00: 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 70 50  mpoundOrderBy(pP
ff10: 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54 61  arse, p, unionTa
ff20: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
ff30: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
ff40: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
ff50: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
ff60: 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72 20   }.        addr 
ff70: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
ff80: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
ff90: 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61  hemeral, unionTa
ffa0: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 0);.        i
ffb0: 66 28 20 70 72 69 6f 72 4f 70 3d 3d 53 52 54 5f  f( priorOp==SRT_
ffc0: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
ffd0: 20 20 20 61 73 73 65 72 74 28 20 6e 53 65 74 50     assert( nSetP
ffe0: 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29  2<sizeof(aSetP2)
fff0: 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30  /sizeof(aSetP2[0
10000 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ]) );.          
10010 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d  aSetP2[nSetP2++]
10020 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
10030 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10040 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
10050 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
10060 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1 );.          
10070 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
10080 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
10090 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f       p->pRightmo
100a0 73 74 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20 31  st->usesEphm = 1
100b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
100c0 20 20 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e      createSortin
100d0 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  gIndex(pParse, p
100e0 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
100f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
10100 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
10110 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
10120 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
10130 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65  ements to our le
10140 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ft.      */.    
10150 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
10160 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  r->pOrderBy );. 
10170 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
10180 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f  ctDestInit(&unio
10190 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20  ndest, priorOp, 
101a0 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20  unionTab);.     
101b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
101c0 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
101d0 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 2c 20  or, &uniondest, 
101e0 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
101f0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
10200 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
10210 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
10220 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
10230 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
10240 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10250 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
10260 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
10270 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  {.         case 
10280 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d  TK_EXCEPT:  op =
10290 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62   SRT_Except;   b
102a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63  reak;.         c
102b0 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20  ase TK_UNION:   
102c0 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20  op = SRT_Union; 
102d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
102e0 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
102f0 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62      op = SRT_Tab
10300 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  le;    break;.  
10310 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
10320 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
10330 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
10340 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 73 61 6c  ;.      p->disal
10350 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  lowOrderBy = pOr
10360 64 65 72 42 79 21 3d 30 3b 0a 20 20 20 20 20 20  derBy!=0;.      
10370 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
10380 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
10390 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
103a0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
103b0 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
103c0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
103d0 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74   uniondest.eDest
103e0 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 72 63 20   = op;.      rc 
103f0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
10400 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f  pParse, p, &unio
10410 6e 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  ndest, 0, 0, 0, 
10420 61 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51  aff);.      /* Q
10430 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
10440 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
10450 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20  () might refill 
10460 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20  p->pOrderBy..   
10470 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f     ** Be sure to
10480 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65   delete p->pOrde
10490 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20  rBy, therefore, 
104a0 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72  to avoid a memor
104b0 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20  y leak. */.     
104c0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
104d0 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72  Delete(p->pOrder
104e0 42 79 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  By);.      p->pP
104f0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
10500 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
10510 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
10520 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
10530 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b  lete(p->pLimit);
10540 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
10550 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
10560 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
10570 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
10580 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20  iLimit = -1;.   
10590 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
105a0 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  -1;.      if( rc
105b0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
105c0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
105d0 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20  d;.      }...   
105e0 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68     /* Convert th
105f0 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65  e data in the te
10600 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e  mporary table in
10610 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
10620 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20  .      ** it is 
10630 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c  that we currentl
10640 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  y need..      */
10650 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
10660 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
10670 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62  orOp || unionTab
10680 21 3d 64 65 73 74 2e 69 50 61 72 6d 20 29 7b 0a  !=dest.iParm ){.
10690 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
106a0 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
106b0 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
106c0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
106d0 20 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74          if( dest
106e0 2e 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c  .eDest==SRT_Call
106f0 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
10700 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
10710 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
10720 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
10730 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
10740 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
10750 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72  .          gener
10760 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
10770 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74  Parse, 0, pFirst
10780 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
10790 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72     }.        iBr
107a0 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
107b0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
107c0 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73         iCont = s
107d0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
107e0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
107f0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
10800 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
10810 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
10820 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10830 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
10840 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65  , unionTab, iBre
10850 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74  ak);.        iSt
10860 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
10870 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
10880 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49  .        selectI
10890 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
108a0 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75   p, p->pEList, u
108b0 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69  nionTab, p->pELi
108c0 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  st->nExpr,.     
108d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108e0 20 20 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c     pOrderBy, -1,
108f0 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
10900 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Break, 0);.     
10910 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
10920 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
10930 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
10940 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10950 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
10960 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20  nTab, iStart);. 
10970 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10980 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
10990 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
109a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
109b0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
109c0 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
109d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
109e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
109f0 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
10a00 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61  : {.      int ta
10a10 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
10a20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
10a30 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
10a40 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
10a50 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  pOffset;.      i
10a60 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
10a70 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73  electDest inters
10a80 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69  ectdest;.      i
10a90 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a  nt r1;..      /*
10aa0 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
10ab0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
10ac0 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
10ad0 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
10ae0 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
10af0 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
10b00 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
10b10 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
10b20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
10b30 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
10b40 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
10b50 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20    */.      tab1 
10b60 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
10b70 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70  ;.      tab2 = p
10b80 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
10b90 20 20 20 20 20 69 66 28 20 70 72 6f 63 65 73 73       if( process
10ba0 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28  CompoundOrderBy(
10bb0 70 50 61 72 73 65 2c 20 70 2c 20 74 61 62 31 29  pParse, p, tab1)
10bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
10bd0 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
10be0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
10bf0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
10c00 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e   createSortingIn
10c10 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20 70  dex(pParse, p, p
10c20 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20 20 20 20  OrderBy);..     
10c30 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
10c40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10c50 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
10c60 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab1, 0);.      a
10c70 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
10c80 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
10c90 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
10ca0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
10cb0 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 69  dr;.      p->pRi
10cc0 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70 68  ghtmost->usesEph
10cd0 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  m = 1;.      ass
10ce0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
10cf0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
10d00 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20   the SELECTs to 
10d10 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65  our left into te
10d20 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
10d30 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ab1"..      */. 
10d40 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
10d50 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65  ctDestInit(&inte
10d60 72 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55  rsectdest, SRT_U
10d70 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20  nion, tab1);.   
10d80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
10d90 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
10da0 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74  rior, &intersect
10db0 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 61  dest, 0, 0, 0, a
10dc0 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ff);.      if( r
10dd0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
10de0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
10df0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
10e00 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
10e10 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e  urrent SELECT in
10e20 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
10e30 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20  le "tab2".      
10e40 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  */.      addr = 
10e50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10e60 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
10e70 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b  meral, tab2, 0);
10e80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10e90 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
10ea0 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
10eb0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
10ec0 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [1] = addr;.    
10ed0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
10ee0 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
10ef0 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
10f00 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
10f10 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
10f20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
10f30 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
10f40 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63  ;.      intersec
10f50 74 64 65 73 74 2e 69 50 61 72 6d 20 3d 20 74 61  tdest.iParm = ta
10f60 62 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  b2;.      rc = s
10f70 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
10f80 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65  rse, p, &interse
10f90 63 74 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c  ctdest, 0, 0, 0,
10fa0 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e   aff);.      p->
10fb0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
10fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10fd0 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d  prDelete(p->pLim
10fe0 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  it);.      p->pL
10ff0 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
11000 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
11010 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  = pOffset;.     
11020 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
11030 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
11040 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
11050 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  }..      /* Gene
11060 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
11070 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
11080 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
11090 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a  mporary.      **
110a0 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a   tables..      *
110b0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
110c0 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
110d0 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
110e0 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
110f0 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  ){.        Selec
11100 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  t *pFirst = p;. 
11110 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46         while( pF
11120 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
11130 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
11140 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
11150 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
11160 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
11170 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
11180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42        }.      iB
11190 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
111a0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
111b0 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
111c0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
111d0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d  el(v);.      com
111e0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
111f0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
11200 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
11210 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11220 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62  , OP_Rewind, tab
11230 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  1, iBreak);.    
11240 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
11250 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
11260 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d  ;.      iStart =
11270 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11280 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c  p2(v, OP_RowKey,
11290 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20   tab1, r1);.    
112a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
112b0 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Op3(v, OP_NotFou
112c0 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c  nd, tab2, iCont,
112d0 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
112e0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
112f0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
11300 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
11310 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
11320 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c  p->pEList, tab1,
11330 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
11340 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
11350 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42           pOrderB
11360 79 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69 43  y, -1, &dest, iC
11370 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b  ont, iBreak, 0);
11380 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11390 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
113a0 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
113b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
113c0 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61  2(v, OP_Next, ta
113d0 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  b1, iStart);.   
113e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
113f0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
11400 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
11410 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11420 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
11430 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
11440 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11450 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
11460 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
11470 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
11480 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
11490 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73  SELECTs in the s
114a0 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68  tatement have th
114b0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
114c0 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69   elements.  ** i
114d0 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73  n their result s
114e0 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ets..  */.  asse
114f0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
11500 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
11510 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  );.  if( p->pELi
11520 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f  st->nExpr!=pPrio
11530 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  r->pEList->nExpr
11540 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
11550 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11560 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  "SELECTs to the 
11570 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
11580 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f  f %s".      " do
11590 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61   not have the sa
115a0 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  me number of res
115b0 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65  ult columns", se
115c0 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
115d0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
115e0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
115f0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
11600 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d    /* Set the num
11610 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
11620 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
11630 65 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d  es.  */.  nCol =
11640 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
11650 72 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 65 74  r;.  while( nSet
11660 50 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  P2 ){.    sqlite
11670 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
11680 20 61 53 65 74 50 32 5b 2d 2d 6e 53 65 74 50 32   aSetP2[--nSetP2
11690 5d 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20  ], nCol);.  }.. 
116a0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c   /* Compute coll
116b0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
116c0 75 73 65 64 20 62 79 20 65 69 74 68 65 72 20 74  used by either t
116d0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
116e0 73 65 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e  se or.  ** by an
116f0 79 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  y temporary tabl
11700 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70  es needed to imp
11710 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f  lement the compo
11720 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a  und select..  **
11730 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49   Attach the KeyI
11740 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f  nfo structure to
11750 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74   all temporary t
11760 61 62 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74  ables.  Invoke t
11770 68 65 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42 59  he.  ** ORDER BY
11780 20 70 72 6f 63 65 73 73 69 6e 67 20 69 66 20 74   processing if t
11790 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
117a0 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a   BY clause..  **
117b0 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
117c0 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
117d0 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
117e0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
117f0 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
11800 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
11810 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
11820 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
11830 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
11840 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
11850 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
11860 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
11870 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
11880 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
11890 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
118a0 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
118b0 20 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e   pOrderBy || p->
118c0 75 73 65 73 45 70 68 6d 20 29 7b 0a 20 20 20 20  usesEphm ){.    
118d0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
118f0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
11900 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
11910 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyInfo;         
11920 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
11930 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
11940 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
11950 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
11960 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11970 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
11980 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73  through SELECT s
11990 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  tatements */.   
119a0 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20   int nKeyCol;   
119b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
119c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
119d0 69 65 73 20 69 6e 20 70 4b 65 79 49 6e 66 6f 2d  ies in pKeyInfo-
119e0 3e 61 43 6f 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43  >aCol[] */.    C
119f0 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b  ollSeq **apColl;
11a00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11a10 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
11a20 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  ugh pKeyInfo->aC
11a30 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f 6c  oll[] */.    Col
11a40 6c 53 65 71 20 2a 2a 61 43 6f 70 79 3b 20 20 20  lSeq **aCopy;   
11a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
11a60 63 6f 70 79 20 6f 66 20 70 4b 65 79 49 6e 66 6f  copy of pKeyInfo
11a70 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 0a 20 20  ->aColl[] */..  
11a80 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
11a90 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20  ghtmost==p );.  
11aa0 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c    nKeyCol = nCol
11ab0 20 2b 20 28 70 4f 72 64 65 72 42 79 20 3f 20 70   + (pOrderBy ? p
11ac0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a  OrderBy->nExpr :
11ad0 20 30 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66   0);.    pKeyInf
11ae0 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
11af0 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
11b00 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
11b10 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
11b20 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 4b 65  f(*pKeyInfo)+nKe
11b30 79 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  yCol*(sizeof(Col
11b40 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20  lSeq*) + 1));.  
11b50 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20    if( !pKeyInfo 
11b60 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
11b70 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
11b80 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
11b90 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a  ect_end;.    }..
11ba0 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e      pKeyInfo->en
11bb0 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e  c = ENC(pParse->
11bc0 64 62 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  db);.    pKeyInf
11bd0 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c  o->nField = nCol
11be0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  ;..    for(i=0, 
11bf0 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d  apColl=pKeyInfo-
11c00 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  >aColl; i<nCol; 
11c10 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a  i++, apColl++){.
11c20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
11c30 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
11c40 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
11c50 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a  ;.      if( 0==*
11c60 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  apColl ){.      
11c70 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 50 61 72    *apColl = pPar
11c80 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
11c90 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
11ca0 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ..    for(pLoop=
11cb0 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
11cc0 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  pLoop->pPrior){.
11cd0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
11ce0 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
11cf0 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f    int addr = pLo
11d00 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
11d10 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
11d20 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20   addr<0 ){.     
11d30 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69       /* If [0] i
11d40 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31  s unused then [1
11d50 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64  ] is also unused
11d60 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20  .  So we can.   
11d70 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
11d80 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73   safely abort as
11d90 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72   soon as the fir
11da0 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69  st unused slot i
11db0 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  s found */.     
11dc0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
11dd0 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
11de0 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20  [1]<0 );.       
11df0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
11e00 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
11e10 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
11e20 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a  v, addr, nCol);.
11e30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11e40 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
11e50 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79  ddr, (char*)pKey
11e60 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
11e70 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  );.        pLoop
11e80 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
11e90 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  ] = -1;.      }.
11ea0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
11eb0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
11ec0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
11ed0 5f 69 74 65 6d 20 2a 70 4f 54 65 72 6d 20 3d 20  _item *pOTerm = 
11ee0 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 20  pOrderBy->a;.   
11ef0 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 45     int nOrderByE
11f00 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
11f10 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  nExpr;.      int
11f20 20 61 64 64 72 3b 0a 20 20 20 20 20 20 75 38 20   addr;.      u8 
11f30 2a 70 53 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20  *pSortOrder;..  
11f40 20 20 20 20 2f 2a 20 52 65 75 73 65 20 74 68 65      /* Reuse the
11f50 20 73 61 6d 65 20 70 4b 65 79 49 6e 66 6f 20 66   same pKeyInfo f
11f60 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  or the ORDER BY 
11f70 61 73 20 77 61 73 20 75 73 65 64 20 61 62 6f 76  as was used abov
11f80 65 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74  e for.      ** t
11f90 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
11fa0 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  ct statements.  
11fb0 45 78 63 65 70 74 20 77 65 20 68 61 76 65 20 74  Except we have t
11fc0 6f 20 63 68 61 6e 67 65 20 6f 75 74 20 74 68 65  o change out the
11fd0 0a 20 20 20 20 20 20 2a 2a 20 70 4b 65 79 49 6e  .      ** pKeyIn
11fe0 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75  fo->aColl[] valu
11ff0 65 73 2e 20 20 53 6f 6d 65 20 6f 66 20 74 68 65  es.  Some of the
12000 20 61 43 6f 6c 6c 5b 5d 20 76 61 6c 75 65 73 20   aColl[] values 
12010 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a  will be.      **
12020 20 72 65 75 73 65 64 20 77 68 65 6e 20 63 6f 6e   reused when con
12030 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 70 4b  structing the pK
12040 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 4f  eyInfo for the O
12050 52 44 45 52 20 42 59 2c 20 73 6f 20 6d 61 6b 65  RDER BY, so make
12060 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79  .      ** a copy
12070 2e 20 20 53 75 66 66 69 63 69 65 6e 74 20 73 70  .  Sufficient sp
12080 61 63 65 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68  ace to hold both
12090 20 74 68 65 20 6e 43 6f 6c 20 65 6e 74 72 69 65   the nCol entrie
120a0 73 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74  s for.      ** t
120b0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
120c0 63 74 20 61 6e 64 20 74 68 65 20 6e 4f 72 64 65  ct and the nOrde
120d0 72 62 79 45 78 70 72 20 65 6e 74 72 69 65 73 20  rbyExpr entries 
120e0 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59  for the ORDER BY
120f0 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 61 6c  .      ** was al
12100 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 2e 20 20  located above.  
12110 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d  But we need to m
12120 6f 76 65 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  ove the compound
12130 20 73 65 6c 65 63 74 0a 20 20 20 20 20 20 2a 2a   select.      **
12140 20 65 6e 74 72 69 65 73 20 6f 75 74 20 6f 66 20   entries out of 
12150 74 68 65 20 77 61 79 20 62 65 66 6f 72 65 20 63  the way before c
12160 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65 20  onstructing the 
12170 4f 52 44 45 52 20 42 59 20 65 6e 74 72 69 65 73  ORDER BY entries
12180 2e 0a 20 20 20 20 20 20 2a 2a 20 4d 6f 76 65 20  ..      ** Move 
12190 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
121a0 65 63 74 20 65 6e 74 72 69 65 73 20 69 6e 74 6f  ect entries into
121b0 20 61 43 6f 70 79 5b 5d 20 77 68 65 72 65 20 74   aCopy[] where t
121c0 68 65 79 20 63 61 6e 20 62 65 0a 20 20 20 20 20  hey can be.     
121d0 20 2a 2a 20 61 63 63 65 73 73 65 64 20 61 6e 64   ** accessed and
121e0 20 72 65 75 73 65 64 20 77 68 65 6e 20 63 6f 6e   reused when con
121f0 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 4f 52  structing the OR
12200 44 45 52 20 42 59 20 65 6e 74 72 69 65 73 2e 0a  DER BY entries..
12210 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
12220 20 6e 43 6f 6c 20 6d 69 67 68 74 20 62 65 20 67   nCol might be g
12230 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 6c  reater than or l
12240 65 73 73 20 74 68 61 6e 20 6e 4f 72 64 65 72 42  ess than nOrderB
12250 79 45 78 70 72 0a 20 20 20 20 20 20 2a 2a 20 77  yExpr.      ** w
12260 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 6d 65  e have to use me
12270 6d 6d 6f 76 65 28 29 20 77 68 65 6e 20 64 6f 69  mmove() when doi
12280 6e 67 20 74 68 65 20 63 6f 70 79 2e 0a 20 20 20  ng the copy..   
12290 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 43 6f 70     */.      aCop
122a0 79 20 3d 20 26 70 4b 65 79 49 6e 66 6f 2d 3e 61  y = &pKeyInfo->a
122b0 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 45 78 70  Coll[nOrderByExp
122c0 72 5d 3b 0a 20 20 20 20 20 20 70 53 6f 72 74 4f  r];.      pSortO
122d0 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  rder = pKeyInfo-
122e0 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
122f0 38 2a 29 26 61 43 6f 70 79 5b 6e 43 6f 6c 5d 3b  8*)&aCopy[nCol];
12300 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 61  .      memmove(a
12310 43 6f 70 79 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  Copy, pKeyInfo->
12320 61 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a 73 69 7a 65  aColl, nCol*size
12330 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29 3b 0a 0a  of(CollSeq*));..
12340 20 20 20 20 20 20 61 70 43 6f 6c 6c 20 3d 20 70        apColl = p
12350 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a  KeyInfo->aColl;.
12360 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
12370 3c 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 20 69  <nOrderByExpr; i
12380 2b 2b 2c 20 70 4f 54 65 72 6d 2b 2b 2c 20 61 70  ++, pOTerm++, ap
12390 43 6f 6c 6c 2b 2b 2c 20 70 53 6f 72 74 4f 72 64  Coll++, pSortOrd
123a0 65 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45  er++){.        E
123b0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 54  xpr *pExpr = pOT
123c0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
123d0 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e      if( (pExpr->
123e0 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
123f0 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20  llate) ){.      
12400 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
12410 72 2d 3e 70 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20  r->pColl!=0 );. 
12420 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c           *apColl
12430 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b   = pExpr->pColl;
12440 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
12450 20 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c            *apCol
12460 6c 20 3d 20 61 43 6f 70 79 5b 70 45 78 70 72 2d  l = aCopy[pExpr-
12470 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20  >iColumn];.     
12480 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 53     }.        *pS
12490 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 54 65 72  ortOrder = pOTer
124a0 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
124b0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
124c0 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  rt( p->pRightmos
124d0 74 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 61 73  t==p );.      as
124e0 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
124f0 6e 45 70 68 6d 5b 32 5d 3e 3d 30 20 29 3b 0a 20  nEphm[2]>=0 );. 
12500 20 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 61       addr = p->a
12510 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 3b 0a  ddrOpenEphm[2];.
12520 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12530 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
12540 72 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  r, p->pOrderBy->
12550 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20 20 20 20  nExpr+2);.      
12560 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
12570 20 3d 20 6e 4f 72 64 65 72 42 79 45 78 70 72 3b   = nOrderByExpr;
12580 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12590 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
125a0 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49  dr, (char*)pKeyI
125b0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
125c0 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
125d0 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20  pKeyInfo = 0;.  
125e0 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
125f0 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20  Tail(pParse, p, 
12600 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  v, p->pEList->nE
12610 78 70 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  xpr, &dest);.   
12620 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   }..    sqlite3_
12630 66 72 65 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  free(pKeyInfo);.
12640 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63    }..multi_selec
12650 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e  t_end:.  pDest->
12660 69 4d 65 6d 20 3d 20 64 65 73 74 2e 69 4d 65 6d  iMem = dest.iMem
12670 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12680 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12690 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
126a0 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64  SELECT */..#ifnd
126b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
126c0 49 45 57 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44  IEW./* Forward D
126d0 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  eclarations */.s
126e0 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
126f0 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33  ExprList(sqlite3
12700 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e  *, ExprList*, in
12710 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  t, ExprList*);.s
12720 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
12730 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c  Select(sqlite3*,
12740 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20   Select *, int, 
12750 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a  ExprList *);../*
12760 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68  .** Scan through
12770 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
12780 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20  pExpr.  Replace 
12790 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20  every reference 
127a0 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69  to.** a column i
127b0 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  n table number i
127c0 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70  Table with a cop
127d0 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e  y of the iColumn
127e0 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  -th.** entry in 
127f0 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65  pEList.  (But le
12800 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ave references t
12810 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75  o the ROWID colu
12820 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  mn .** unchanged
12830 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .).**.** This ro
12840 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66  utine is part of
12850 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
12860 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75  procedure.  A su
12870 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20  bquery.** whose 
12880 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65  result set is de
12890 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20  fined by pEList 
128a0 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79  appears as entry
128b0 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20   in the.** FROM 
128c0 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
128d0 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65  CT such that the
128e0 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73   VDBE cursor ass
128f0 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a  igned to that.**
12900 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74   FORM clause ent
12910 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54  ry is iTable.  T
12920 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
12930 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a   the necessary .
12940 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45  ** changes to pE
12950 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72  xpr so that it r
12960 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
12970 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  o the source tab
12980 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62  le.** of the sub
12990 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65  query rather the
129a0 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
129b0 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  he subquery..*/.
129c0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
129d0 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33  tExpr(.  sqlite3
129e0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
129f0 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
12a00 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e  rors to this con
12a10 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
12a20 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
12a30 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
12a40 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
12a50 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ccurs */.  int i
12a60 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  Table,         /
12a70 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
12a80 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
12a90 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
12aa0 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
12ab0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
12ac0 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
12ad0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
12ae0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
12af0 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
12b00 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
12b10 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
12b20 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
12b30 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
12b40 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65   TK_NULL;.    }e
12b50 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
12b60 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73  *pNew;.      ass
12b70 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26  ert( pEList!=0 &
12b80 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
12b90 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
12ba0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12bb0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
12bc0 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
12bd0 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  ==0 && pExpr->pL
12be0 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
12bf0 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61  pNew = pEList->a
12c00 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
12c10 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  .pExpr;.      as
12c20 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b  sert( pNew!=0 );
12c30 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
12c40 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20   = pNew->op;.   
12c50 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
12c60 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20  ->pLeft==0 );.  
12c70 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
12c80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
12c90 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 4c 65 66  p(db, pNew->pLef
12ca0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
12cb0 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  ( pExpr->pRight=
12cc0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
12cd0 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r->pRight = sqli
12ce0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
12cf0 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  New->pRight);.  
12d00 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
12d10 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  r->pList==0 );. 
12d20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73       pExpr->pLis
12d30 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
12d40 69 73 74 44 75 70 28 64 62 2c 20 70 4e 65 77 2d  istDup(db, pNew-
12d50 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  >pList);.      p
12d60 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
12d70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  New->iTable;.   
12d80 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
12d90 20 70 4e 65 77 2d 3e 70 54 61 62 3b 0a 20 20 20   pNew->pTab;.   
12da0 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
12db0 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d  n = pNew->iColum
12dc0 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  n;.      pExpr->
12dd0 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67  iAgg = pNew->iAg
12de0 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  g;.      sqlite3
12df0 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70  TokenCopy(db, &p
12e00 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e  Expr->token, &pN
12e10 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  ew->token);.    
12e20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
12e30 70 79 28 64 62 2c 20 26 70 45 78 70 72 2d 3e 73  py(db, &pExpr->s
12e40 70 61 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e  pan, &pNew->span
12e50 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
12e60 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
12e70 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
12e80 4e 65 77 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  New->pSelect);. 
12e90 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67       pExpr->flag
12ea0 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73 3b  s = pNew->flags;
12eb0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
12ec0 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62      substExpr(db
12ed0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
12ee0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
12ef0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64  .    substExpr(d
12f00 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  b, pExpr->pRight
12f10 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
12f20 29 3b 0a 20 20 20 20 73 75 62 73 74 53 65 6c 65  );.    substSele
12f30 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 53  ct(db, pExpr->pS
12f40 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70  elect, iTable, p
12f50 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
12f60 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45  tExprList(db, pE
12f70 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62  xpr->pList, iTab
12f80 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
12f90 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
12fa0 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
12fb0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
12fc0 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
12fd0 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
12fe0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
12ff0 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c  *pList,     /* L
13000 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20  ist to scan and 
13010 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
13020 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a   substitutes */.
13030 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
13040 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
13050 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
13060 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
13070 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
13080 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
13090 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
130a0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
130b0 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
130c0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
130d0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75  pr; i++){.    su
130e0 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73  bstExpr(db, pLis
130f0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
13100 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
13110 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
13120 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20  d substSelect(. 
13130 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
13140 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
13150 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65  malloc errors he
13160 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  re */.  Select *
13170 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
13180 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13190 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b   in which to mak
131a0 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
131b0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
131c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
131d0 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  le to be replace
131e0 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
131f0 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
13200 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
13210 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 21 70 20   */.){.  if( !p 
13220 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73  ) return;.  subs
13230 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
13240 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  >pEList, iTable,
13250 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
13260 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
13270 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c  >pGroupBy, iTabl
13280 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
13290 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
132a0 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61  p->pOrderBy, iTa
132b0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
132c0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
132d0 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65  >pHaving, iTable
132e0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
132f0 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57  stExpr(db, p->pW
13300 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45  here, iTable, pE
13310 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65  List);.  substSe
13320 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69  lect(db, p->pPri
13330 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  or, iTable, pELi
13340 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  st);.}.#endif /*
13350 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13360 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
13370 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13380 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54  MIT_VIEW./*.** T
13390 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
133a0 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
133b0 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72  subqueries in or
133c0 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20  der to speed.** 
133d0 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72  execution.  It r
133e0 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
133f0 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
13400 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
13410 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a  ing.** occurs..*
13420 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
13430 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
13440 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
13450 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
13460 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
13470 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
13480 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
13490 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
134a0 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
134b0 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
134c0 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
134d0 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
134e0 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
134f0 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
13500 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
13510 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
13520 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
13530 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
13540 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
13550 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
13560 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
13570 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
13580 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
13590 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
135a0 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
135b0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
135c0 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
135d0 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
135e0 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
135f0 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
13600 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
13610 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
13620 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
13630 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
13640 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
13650 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
13660 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
13670 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
13680 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
13690 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
136a0 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
136b0 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
136c0 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
136d0 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f  his simpificatio
136e0 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
136f0 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
13700 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
13710 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
13720 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
13730 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
13740 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
13750 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
13760 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
13770 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
13780 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
13790 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  tening is only a
137a0 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20  ttempted if all 
137b0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
137c0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
137d0 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
137e0 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
137f0 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
13800 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61  both use aggrega
13810 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  tes..**.**   (2)
13820 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
13830 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
13840 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  te or the outer 
13850 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
13860 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  oin..**.**   (3)
13870 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
13880 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
13890 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
138a0 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f 72  t outer join, or
138b0 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 73  .**        the s
138c0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 69  ubquery is not i
138d0 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20 28  tself a join.  (
138e0 54 69 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a 0a  Ticket #306).**.
138f0 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75  **   (4)  The su
13900 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49  bquery is not DI
13910 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75  STINCT or the ou
13920 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
13930 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
13940 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75 65   (5)  The subque
13950 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
13960 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  CT or the outer 
13970 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
13980 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
13990 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
139a0 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65   (6)  The subque
139b0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
139c0 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
139d0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
139e0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44   not.**        D
139f0 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20  ISTINCT..**.**  
13a00 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65   (7)  The subque
13a10 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c  ry has a FROM cl
13a20 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38  ause..**.**   (8
13a30 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
13a40 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
13a50 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
13a60 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
13a70 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29  oin..**.**   (9)
13a80 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
13a90 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
13aa0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
13ab0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
13ac0 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72  e.**        aggr
13ad0 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  egates..**.**  (
13ae0 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65 72  10)  The subquer
13af0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
13b00 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
13b10 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
13b20 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
13b30 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a  use LIMIT..**.**
13b40 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71    (11)  The subq
13b50 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
13b60 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
13b70 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20  both have ORDER 
13b80 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  BY clauses..**.*
13b90 2a 20 20 28 31 32 29 20 20 54 68 65 20 73 75 62  *  (12)  The sub
13ba0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65  query is not the
13bb0 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
13bc0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
13bd0 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   or the.**      
13be0 20 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e    subquery has n
13bf0 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  o WHERE clause. 
13c00 20 28 61 64 64 65 64 20 62 79 20 74 69 63 6b 65   (added by ticke
13c10 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 20 28  t #350).**.**  (
13c20 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  13)  The subquer
13c30 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72  y and outer quer
13c40 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
13c50 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20 28  e LIMIT.**.**  (
13c60 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  14)  The subquer
13c70 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f  y does not use O
13c80 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20 20 28 31 35  FFSET.**.**  (15
13c90 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  )  The outer que
13ca0 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ry is not part o
13cb0 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
13cc0 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20  ect or the.**   
13cd0 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64 6f       subquery do
13ce0 65 73 20 6e 6f 74 20 68 61 76 65 20 62 6f 74 68  es not have both
13cf0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 61 6e 64   an ORDER BY and
13d00 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e   a LIMIT clause.
13d10 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20  .**        (See 
13d20 74 69 63 6b 65 74 20 23 32 33 33 39 29 0a 2a 2a  ticket #2339).**
13d30 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f  .**  (16)  The o
13d40 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
13d50 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
13d60 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20 64  r the subquery d
13d70 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f  oes.**        no
13d80 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  t contain ORDER 
13d90 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39  BY.  (Ticket #29
13da0 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74  42)  This used t
13db0 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20  o not matter.** 
13dc0 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20         until we 
13dd0 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67  introduced the g
13de0 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75  roup_concat() fu
13df0 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20  nction.  .**.** 
13e00 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  In this routine,
13e10 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   the "p" paramet
13e20 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
13e30 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
13e40 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75  ry..** The subqu
13e50 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e  ery is p->pSrc->
13e60 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67  a[iFrom].  isAgg
13e70 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
13e80 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75  outer query.** u
13e90 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61  ses aggregates a
13ea0 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nd subqueryIsAgg
13eb0 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
13ec0 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67  subquery uses ag
13ed0 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
13ee0 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
13ef0 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20   not attempted, 
13f00 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
13f10 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75  a no-op and retu
13f20 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61  rns 0..** If fla
13f30 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d  ttening is attem
13f40 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  pted this routin
13f50 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a  e returns 1..**.
13f60 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78  ** All of the ex
13f70 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
13f80 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20  s must occur on 
13f90 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71  both the outer q
13fa0 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20  uery and.** the 
13fb0 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20  subquery before 
13fc0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
13fd0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
13fe0 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
13ff0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
14000 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
14010 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
14020 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
14030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14040 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72   parent or outer
14050 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
14060 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
14070 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
14080 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d  ndex in p->pSrc-
14090 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65  >a[] of the inne
140a0 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  r subquery */.  
140b0 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20  int isAgg,      
140c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
140d0 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65  outer SELECT use
140e0 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
140f0 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73  tions */.  int s
14100 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20  ubqueryIsAgg    
14110 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73  /* True if the s
14120 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
14130 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
14140 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
14150 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20  *pSub;       /* 
14160 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
14170 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f  or "subquery" */
14180 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
14190 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
141a0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
141b0 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
141c0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53    SrcList *pSubS
141d0 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
141e0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
141f0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78  subquery */.  Ex
14200 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20  prList *pList;  
14210 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
14220 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72  set of the outer
14230 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
14240 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  iParent;        
14250 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  /* VDBE cursor n
14260 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75  umber of the pSu
14270 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d  b result set tem
14280 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  p table */.  int
14290 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
142a0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
142b0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
142c0 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
142d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
142e0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
142f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
14300 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20  tem *pSubitem;  
14310 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
14320 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
14330 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65  to see if flatte
14340 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
14350 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
14360 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  not..  */.  if( 
14370 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
14380 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
14390 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
143a0 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26  c && iFrom>=0 &&
143b0 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72   iFrom<pSrc->nSr
143c0 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20  c );.  pSubitem 
143d0 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  = &pSrc->a[iFrom
143e0 5d 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62  ];.  pSub = pSub
143f0 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  item->pSelect;. 
14400 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30   assert( pSub!=0
14410 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20   );.  if( isAgg 
14420 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67  && subqueryIsAgg
14430 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
14440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14450 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20  Restriction (1) 
14460 20 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65   */.  if( subque
14470 72 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d  ryIsAgg && pSrc-
14480 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e  >nSrc>1 ) return
14490 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
144a0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20  Restriction (2) 
144b0 20 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20   */.  pSubSrc = 
144c0 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73  pSub->pSrc;.  as
144d0 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b  sert( pSubSrc );
144e0 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76  .  /* Prior to v
144f0 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68  ersion 3.1.2, wh
14500 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
14510 53 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69  SET had to be si
14520 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a  mple constants,.
14530 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61    ** not arbitra
14540 72 79 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c  ry expresssions,
14550 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65   we allowed some
14560 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49   combining of LI
14570 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
14580 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79   ** because they
14590 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74   could be comput
145a0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
145b0 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49  me.  But when LI
145c0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
145d0 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74   ** became arbit
145e0 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73  rary expressions
145f0 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64  , we were forced
14600 20 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74   to add restrict
14610 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61  ions (13).  ** a
14620 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66  nd (14). */.  if
14630 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
14640 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65  & p->pLimit ) re
14650 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
14660 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
14670 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66  ion (13) */.  if
14680 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20  ( pSub->pOffset 
14690 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146b0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
146c0 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66  ion (14) */.  if
146d0 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  ( p->pRightmost 
146e0 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  && pSub->pLimit 
146f0 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
14700 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
14710 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14740 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35   Restriction (15
14750 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  ) */.  }.  if( p
14760 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  SubSrc->nSrc==0 
14770 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
14780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14790 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
147a0 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 28   (7)  */.  if( (
147b0 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74  pSub->isDistinct
147c0 20 7c 7c 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   || pSub->pLimit
147d0 29 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ) .         && (
147e0 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  pSrc->nSrc>1 || 
147f0 69 73 41 67 67 29 20 29 7b 20 20 20 20 20 20 20  isAgg) ){       
14800 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
14810 6e 73 20 28 34 29 28 35 29 28 38 29 28 39 29 20  ns (4)(5)(8)(9) 
14820 2a 2f 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  */.     return 0
14830 3b 20 20 20 20 20 20 20 0a 20 20 7d 0a 20 20 69  ;       .  }.  i
14840 66 28 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  f( p->isDistinct
14850 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
14860 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  g ) return 0;   
14870 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
14880 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 69  tion (6)  */.  i
14890 66 28 20 28 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f  f( (p->disallowO
148a0 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e 70 4f 72  rderBy || p->pOr
148b0 64 65 72 42 79 29 20 26 26 20 70 53 75 62 2d 3e  derBy) && pSub->
148c0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
148d0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14900 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
14910 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a  ion (11) */.  }.
14920 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 70    if( isAgg && p
14930 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20  Sub->pOrderBy ) 
14940 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
14950 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
14960 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a  riction (16) */.
14970 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
14980 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62  n 3:  If the sub
14990 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c  query is a join,
149a0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
149b0 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a  ubquery is .  **
149c0 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65   not used as the
149d0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
149e0 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e  f an outer join.
149f0 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68    Examples of wh
14a00 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e  y this.  ** is n
14a10 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
14a20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
14a30 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
14a40 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20   (t2 JOIN t3).  
14a50 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
14a60 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
14a70 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
14a80 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
14a90 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
14aa0 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a  OIN t2) JOIN t3.
14ab0 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20    **.  ** which 
14ac0 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68  is not at all th
14ad0 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20  e same thing..  
14ae0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 53 72 63  */.  if( pSubSrc
14af0 2d 3e 6e 53 72 63 3e 31 20 26 26 20 28 70 53 75  ->nSrc>1 && (pSu
14b00 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  bitem->jointype 
14b10 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
14b20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
14b30 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69    }..  /* Restri
14b40 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68  ction 12:  If th
14b50 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
14b60 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
14b70 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a  of a left outer.
14b80 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20    ** join, make 
14b90 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
14ba0 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63  y has no WHERE c
14bb0 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65  lause..  ** An e
14bc0 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
14bd0 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  his is not allow
14be0 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
14bf0 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
14c00 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54  TER JOIN (SELECT
14c10 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   * FROM t2 WHERE
14c20 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20   t2.x>0).  **.  
14c30 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
14c40 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
14c50 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
14c60 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
14c70 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
14c80 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a  2) WHERE t2.x>0.
14c90 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68    **.  ** But th
14ca0 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69  e t2.x>0 test wi
14cb0 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f  ll always fail o
14cc0 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20  n a NULL row of 
14cd0 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65  t2, which.  ** e
14ce0 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65  ffectively conve
14cf0 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f  rts the OUTER JO
14d00 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52  IN into an INNER
14d10 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66   JOIN..  */.  if
14d20 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69  ( (pSubitem->joi
14d30 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
14d40 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 57  )!=0 && pSub->pW
14d50 68 65 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72  here!=0 ){.    r
14d60 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
14d70 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
14d80 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
14d90 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ans flattening i
14da0 73 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20  s permitted for 
14db0 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74  the.  ** iFrom-t
14dc0 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  h entry of the F
14dd0 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68  ROM clause in th
14de0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
14df0 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61   */..  /* Move a
14e00 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
14e10 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
14e20 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
14e30 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
14e40 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
14e50 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
14e60 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
14e70 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
14e80 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
14e90 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
14ea0 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
14eb0 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
14ec0 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
14ed0 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
14ee0 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
14ef0 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
14f00 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
14f10 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
14f20 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
14f30 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
14f40 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
14f50 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
14f60 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
14f70 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
14f80 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
14f90 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
14fa0 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
14fb0 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61  g in..  */.  iPa
14fc0 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  rent = pSubitem-
14fd0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20  >iCursor;.  {.  
14fe0 20 20 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20    int nSubSrc = 
14ff0 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20  pSubSrc->nSrc;. 
15000 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20     int jointype 
15010 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e  = pSubitem->join
15020 74 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74  type;..    sqlit
15030 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53  e3DeleteTable(pS
15040 75 62 69 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20  ubitem->pTab);. 
15050 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
15060 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
15070 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ase);.    sqlite
15080 33 5f 66 72 65 65 28 70 53 75 62 69 74 65 6d 2d  3_free(pSubitem-
15090 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
150a0 69 74 65 33 5f 66 72 65 65 28 70 53 75 62 69 74  ite3_free(pSubit
150b0 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
150c0 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20   pSubitem->pTab 
150d0 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 69 74 65  = 0;.    pSubite
150e0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30  m->zDatabase = 0
150f0 3b 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e  ;.    pSubitem->
15100 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70  zName = 0;.    p
15110 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  Subitem->zAlias 
15120 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 53 75  = 0;.    if( nSu
15130 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  bSrc>1 ){.      
15140 69 6e 74 20 65 78 74 72 61 20 3d 20 6e 53 75 62  int extra = nSub
15150 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 20 20 66  Src - 1;.      f
15160 6f 72 28 69 3d 31 3b 20 69 3c 6e 53 75 62 53 72  or(i=1; i<nSubSr
15170 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  c; i++){.       
15180 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53   pSrc = sqlite3S
15190 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
151a0 20 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20   pSrc, 0, 0);.  
151b0 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d        if( pSrc==
151c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
151d0 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20  ->pSrc = 0;.    
151e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
151f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15200 7d 0a 20 20 20 20 20 20 70 2d 3e 70 53 72 63 20  }.      p->pSrc 
15210 3d 20 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f  = pSrc;.      fo
15220 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31  r(i=pSrc->nSrc-1
15230 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d  ; i-extra>=iFrom
15240 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  ; i--){.        
15250 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72  pSrc->a[i] = pSr
15260 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20  c->a[i-extra];. 
15270 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15280 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
15290 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
152a0 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
152b0 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  ] = pSubSrc->a[i
152c0 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ];.      memset(
152d0 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20  &pSubSrc->a[i], 
152e0 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72  0, sizeof(pSubSr
152f0 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d  c->a[i]));.    }
15300 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72  .    pSrc->a[iFr
15310 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a  om].jointype = j
15320 6f 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20  ointype;.  }..  
15330 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62  /* Now begin sub
15340 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65  stituting subque
15350 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78  ry result set ex
15360 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20  pressions for . 
15370 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
15380 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
15390 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
153a0 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61  ..  ** .  ** Exa
153b0 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
153c0 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a    SELECT a+5, b*
153d0 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  10 FROM (SELECT 
153e0 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41  x*3 AS a, y+10 A
153f0 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S b FROM t1) WHE
15400 52 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c  RE a>b;.  **   \
15410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15420 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
15430 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f  ___ subquery ___
15440 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
15450 20 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f    /.  **    \___
15460 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
15470 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
15480 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
15490 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20  _____________/. 
154a0 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b   **.  ** We look
154b0 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
154c0 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
154d0 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
154e0 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
154f0 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74   ** "a" we subst
15500 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20  itute "x*3" and 
15510 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
15520 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69  ee "b" we substi
15530 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a  tute "y+10"..  *
15540 2f 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70  /.  pList = p->p
15550 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30  EList;.  for(i=0
15560 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
15570 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
15580 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28   *pExpr;.    if(
15590 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
155a0 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20  me==0 && (pExpr 
155b0 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
155c0 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20  xpr)->span.z!=0 
155d0 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  ){.      pList->
155e0 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 0a 20 20  a[i].zName = .  
155f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15600 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
15610 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 73 70  (char*)pExpr->sp
15620 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61  an.z, pExpr->spa
15630 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n.n);.    }.  }.
15640 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
15650 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69  db, p->pEList, i
15660 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
15670 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 69 73 41  List);.  if( isA
15680 67 67 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45  gg ){.    substE
15690 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
156a0 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74  GroupBy, iParent
156b0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
156c0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64  .    substExpr(d
156d0 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69  b, p->pHaving, i
156e0 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
156f0 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  List);.  }.  if(
15700 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
15710 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15720 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
15730 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
15740 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42   = pSub->pOrderB
15750 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f 72  y;.    pSub->pOr
15760 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  derBy = 0;.  }el
15770 73 65 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  se if( p->pOrder
15780 42 79 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45  By ){.    substE
15790 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
157a0 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74  OrderBy, iParent
157b0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
157c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d  .  }.  if( pSub-
157d0 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 70  >pWhere ){.    p
157e0 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
157f0 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  xprDup(db, pSub-
15800 3e 70 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c 73  >pWhere);.  }els
15810 65 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  e{.    pWhere = 
15820 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62  0;.  }.  if( sub
15830 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
15840 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61    assert( p->pHa
15850 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ving==0 );.    p
15860 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70  ->pHaving = p->p
15870 57 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57  Where;.    p->pW
15880 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
15890 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c     substExpr(db,
158a0 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61   p->pHaving, iPa
158b0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
158c0 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76  st);.    p->pHav
158d0 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
158e0 72 41 6e 64 28 64 62 2c 20 70 2d 3e 70 48 61 76  rAnd(db, p->pHav
158f0 69 6e 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ing, .          
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15910 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15920 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
15930 48 61 76 69 6e 67 29 29 3b 0a 20 20 20 20 61 73  Having));.    as
15940 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
15950 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70  y==0 );.    p->p
15960 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
15970 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
15980 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29   pSub->pGroupBy)
15990 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
159a0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
159b0 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c  pWhere, iParent,
159c0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
159d0 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
159e0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
159f0 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 57  b, p->pWhere, pW
15a00 68 65 72 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  here);.  }..  /*
15a10 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
15a20 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
15a30 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
15a40 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a  nner or the.  **
15a50 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
15a60 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a  distinct. .  */.
15a70 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20    p->isDistinct 
15a80 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  = p->isDistinct 
15a90 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69  || pSub->isDisti
15aa0 6e 63 74 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  nct;..  /*.  ** 
15ab0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
15ac0 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49  (SELECT ... LIMI
15ad0 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49  T a OFFSET b) LI
15ae0 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a  MIT x OFFSET y;.
15af0 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 65 20 69 73    **.  ** One is
15b00 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20   tempted to try 
15b10 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74  to add a and b t
15b20 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69  o combine the li
15b30 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a  mits.  But this.
15b40 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f    ** does not wo
15b50 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d  rk if either lim
15b60 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
15b70 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
15b80 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70  >pLimit ){.    p
15b90 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->pLimit = pSub-
15ba0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 53 75  >pLimit;.    pSu
15bb0 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
15bc0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c   }..  /* Finiall
15bd0 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
15be0 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
15bf0 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
15c00 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
15c10 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
15c20 6c 65 63 74 44 65 6c 65 74 65 28 70 53 75 62 29  lectDelete(pSub)
15c30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
15c40 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
15c50 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f  _OMIT_VIEW */../
15c60 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
15c70 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15c80 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
15c90 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69  rgument to see i
15ca0 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 6d 69 6e  f it.** is a min
15cb0 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
15cc0 79 2e 20 52 65 74 75 72 6e 20 4f 52 44 45 52 42  y. Return ORDERB
15cd0 59 5f 4d 49 4e 20 6f 72 20 4f 52 44 45 52 42 59  Y_MIN or ORDERBY
15ce0 5f 4d 41 58 20 69 66 20 0a 2a 2a 20 69 74 20 69  _MAX if .** it i
15cf0 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73  s, or 0 otherwis
15d00 65 2e 20 41 74 20 70 72 65 73 65 6e 74 2c 20 61  e. At present, a
15d10 20 71 75 65 72 79 20 69 73 20 63 6f 6e 73 69 64   query is consid
15d20 65 72 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20  ered to be.** a 
15d30 6d 69 6e 28 29 2f 6d 61 78 28 29 20 71 75 65 72  min()/max() quer
15d40 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e  y if:.**.**   1.
15d50 20 54 68 65 72 65 20 69 73 20 61 20 73 69 6e 67   There is a sing
15d60 6c 65 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  le object in the
15d70 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
15d80 0a 2a 2a 20 20 20 32 2e 20 54 68 65 72 65 20 69  .**   2. There i
15d90 73 20 61 20 73 69 6e 67 6c 65 20 65 78 70 72 65  s a single expre
15da0 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73  ssion in the res
15db0 75 6c 74 20 73 65 74 2c 20 61 6e 64 20 69 74 20  ult set, and it 
15dc0 69 73 0a 2a 2a 20 20 20 20 20 20 65 69 74 68 65  is.**      eithe
15dd0 72 20 6d 69 6e 28 78 29 20 6f 72 20 6d 61 78 28  r min(x) or max(
15de0 78 29 2c 20 77 68 65 72 65 20 78 20 69 73 20 61  x), where x is a
15df0 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63   column referenc
15e00 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
15e10 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72   minMaxQuery(Par
15e20 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
15e30 63 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a  ct *p){.  Expr *
15e40 70 45 78 70 72 3b 0a 20 20 45 78 70 72 4c 69 73  pExpr;.  ExprLis
15e50 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  t *pEList = p->p
15e60 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45  EList;..  if( pE
15e70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
15e80 20 72 65 74 75 72 6e 20 4f 52 44 45 52 42 59 5f   return ORDERBY_
15e90 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45 78 70 72 20  NORMAL;.  pExpr 
15ea0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  = pEList->a[0].p
15eb0 45 78 70 72 3b 0a 20 20 70 45 4c 69 73 74 20 3d  Expr;.  pEList =
15ec0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
15ed0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
15ee0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
15ef0 7c 7c 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20  || pEList==0 || 
15f00 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
15f10 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
15f20 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  f( pEList->a[0].
15f30 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
15f40 47 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  G_COLUMN ) retur
15f50 6e 20 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  n ORDERBY_NORMAL
15f60 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74  ;.  if( pExpr->t
15f70 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75  oken.n!=3 ) retu
15f80 72 6e 20 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  rn ORDERBY_NORMA
15f90 4c 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  L;.  if( sqlite3
15fa0 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
15fb0 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
15fc0 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  min",3)==0 ){.  
15fd0 20 20 72 65 74 75 72 6e 20 4f 52 44 45 52 42 59    return ORDERBY
15fe0 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _MIN;.  }else if
15ff0 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
16000 70 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  p((char*)pExpr->
16010 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29  token.z,"max",3)
16020 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
16030 6e 20 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20  n ORDERBY_MAX;. 
16040 20 7d 0a 20 20 72 65 74 75 72 6e 20 4f 52 44 45   }.  return ORDE
16050 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a 2f  RBY_NORMAL;.}../
16060 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16070 65 20 72 65 73 6f 6c 76 65 73 20 61 6e 79 20 6e  e resolves any n
16080 61 6d 65 73 20 75 73 65 64 20 69 6e 20 74 68 65  ames used in the
16090 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
160a0 68 65 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 53  he.** supplied S
160b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
160c0 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   If the SELECT s
160d0 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 72  tatement being r
160e0 65 73 6f 6c 76 65 64 0a 2a 2a 20 69 73 20 61 20  esolved.** is a 
160f0 73 75 62 2d 73 65 6c 65 63 74 2c 20 74 68 65 6e  sub-select, then
16100 20 70 4f 75 74 65 72 4e 43 20 69 73 20 61 20 70   pOuterNC is a p
16110 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4e 61  ointer to the Na
16120 6d 65 43 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f 66  meContext .** of
16130 20 74 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45   the parent SELE
16140 43 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  CT..*/.int sqlit
16150 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
16160 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
16170 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
16180 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
16190 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
161a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
161b0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
161c0 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
161d0 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
161e0 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20  t *pOuterNC  /* 
161f0 54 68 65 20 6f 75 74 65 72 20 6e 61 6d 65 20 63  The outer name c
16200 6f 6e 74 65 78 74 2e 20 4d 61 79 20 62 65 20 4e  ontext. May be N
16210 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  ULL. */.){.  Exp
16220 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
16230 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
16240 74 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20  t set. */.  int 
16250 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
16260 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f         /* For-lo
16270 6f 70 20 76 61 72 69 61 62 6c 65 20 75 73 65 64  op variable used
16280 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61   in multiple pla
16290 63 65 73 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ces */.  NameCon
162a0 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20  text sNC;       
162b0 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d      /* Local nam
162c0 65 2d 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  e-context */.  E
162d0 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
162e0 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  y;        /* The
162f0 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65   group by clause
16300 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
16310 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75  s routine has ru
16320 6e 20 62 65 66 6f 72 65 2c 20 72 65 74 75 72 6e  n before, return
16330 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f   immediately. */
16340 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73 6f  .  if( p->isReso
16350 6c 76 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65  lved ){.    asse
16360 72 74 28 20 21 70 4f 75 74 65 72 4e 43 20 29 3b  rt( !pOuterNC );
16370 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16380 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  TE_OK;.  }.  p->
16390 69 73 52 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a  isResolved = 1;.
163a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68  .  /* If there h
163b0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
163c0 20 65 72 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68   errors, do noth
163d0 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  ing. */.  if( pP
163e0 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a  arse->nErr>0 ){.
163f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16400 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
16410 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65 20 73  /* Prepare the s
16420 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2e  elect statement.
16430 20 54 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20   This call will 
16440 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 63 75 72  allocate all cur
16450 73 6f 72 73 0a 20 20 2a 2a 20 72 65 71 75 69 72  sors.  ** requir
16460 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
16470 20 74 61 62 6c 65 73 20 61 6e 64 20 73 75 62 71   tables and subq
16480 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
16490 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  OM clause..  */.
164a0 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74    if( prepSelect
164b0 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20  Stmt(pParse, p) 
164c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
164d0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
164e0 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68  .  /* Resolve th
164f0 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
16500 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
16510 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54  FFSET clauses. T
16520 68 65 73 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f  hese.  ** are no
16530 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66  t allowed to ref
16540 65 72 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c  er to any names,
16550 20 73 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74   so pass an empt
16560 79 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20  y NameContext.. 
16570 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e   */.  memset(&sN
16580 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
16590 29 29 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65  ));.  sNC.pParse
165a0 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28   = pParse;.  if(
165b0 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
165c0 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
165d0 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20  ->pLimit) ||.   
165e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 52 65     sqlite3ExprRe
165f0 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c  solveNames(&sNC,
16600 20 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a   p->pOffset) ){.
16610 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16620 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
16630 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f  /* Set up the lo
16640 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  cal name-context
16650 20 74 6f 20 70 61 73 73 20 74 6f 20 45 78 70 72   to pass to Expr
16660 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 74  ResolveNames() t
16670 6f 0a 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74  o.  ** resolve t
16680 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  he expression-li
16690 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 61  st..  */.  sNC.a
166a0 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 73  llowAgg = 1;.  s
166b0 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d  NC.pSrcList = p-
166c0 3e 70 53 72 63 3b 0a 20 20 73 4e 43 2e 70 4e 65  >pSrc;.  sNC.pNe
166d0 78 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 0a  xt = pOuterNC;..
166e0 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d    /* Resolve nam
166f0 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  es in the result
16700 20 73 65 74 2e 20 2a 2f 0a 20 20 70 45 4c 69 73   set. */.  pELis
16710 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
16720 20 69 66 28 20 21 70 45 4c 69 73 74 20 29 20 72   if( !pEList ) r
16730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
16740 4f 52 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  OR;.  for(i=0; i
16750 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
16760 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
16770 70 58 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  pX = pEList->a[i
16780 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
16790 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
167a0 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
167b0 58 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  X) ){.      retu
167c0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
167d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
167e0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
167f0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
16800 69 6f 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  ions in the resu
16810 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47  lt-set, and no G
16820 52 4f 55 50 20 42 59 20 0a 20 20 2a 2a 20 65 78  ROUP BY .  ** ex
16830 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74  pression, do not
16840 20 61 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65   allow aggregate
16850 73 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20  s in any of the 
16860 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
16870 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
16880 28 20 21 70 2d 3e 69 73 41 67 67 20 29 3b 0a 20  ( !p->isAgg );. 
16890 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
168a0 47 72 6f 75 70 42 79 3b 0a 20 20 69 66 28 20 70  GroupBy;.  if( p
168b0 47 72 6f 75 70 42 79 20 7c 7c 20 73 4e 43 2e 68  GroupBy || sNC.h
168c0 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70 2d 3e  asAgg ){.    p->
168d0 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 65 6c  isAgg = 1;.  }el
168e0 73 65 7b 0a 20 20 20 20 73 4e 43 2e 61 6c 6c 6f  se{.    sNC.allo
168f0 77 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  wAgg = 0;.  }.. 
16900 20 2f 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20   /* If a HAVING 
16910 63 6c 61 75 73 65 20 69 73 20 70 72 65 73 65 6e  clause is presen
16920 74 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  t, then there mu
16930 73 74 20 62 65 20 61 20 47 52 4f 55 50 20 42 59  st be a GROUP BY
16940 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
16950 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26  if( p->pHaving &
16960 26 20 21 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  & !pGroupBy ){. 
16970 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
16980 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 47 52  sg(pParse, "a GR
16990 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73  OUP BY clause is
169a0 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
169b0 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 72   HAVING");.    r
169c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
169d0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  OR;.  }..  /* Ad
169e0 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
169f0 20 6c 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d   list to the nam
16a00 65 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65  e-context before
16a10 20 70 61 72 73 69 6e 67 20 74 68 65 0a 20 20 2a   parsing the.  *
16a20 2a 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  * other expressi
16a30 6f 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ons in the SELEC
16a40 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  T statement. Thi
16a50 73 20 69 73 20 73 6f 20 74 68 61 74 0a 20 20 2a  s is so that.  *
16a60 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  * expressions in
16a70 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
16a80 65 20 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66  e (etc.) can ref
16a90 65 72 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e  er to expression
16aa0 73 20 62 79 0a 20 20 2a 2a 20 61 6c 69 61 73 65  s by.  ** aliase
16ab0 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
16ac0 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  set..  **.  ** M
16ad0 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74  inor point: If t
16ae0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
16af0 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
16b00 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a  sion will be.  *
16b10 2a 20 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66  * re-evaluated f
16b20 6f 72 20 65 61 63 68 20 72 65 66 65 72 65 6e 63  or each referenc
16b30 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  e to it..  */.  
16b40 73 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e  sNC.pEList = p->
16b50 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71  pEList;.  if( sq
16b60 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
16b70 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
16b80 57 68 65 72 65 29 20 7c 7c 0a 20 20 20 20 20 73  Where) ||.     s
16b90 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
16ba0 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
16bb0 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20  pHaving) ){.    
16bc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
16bd0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ROR;.  }.  if( p
16be0 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
16bf0 20 20 20 69 66 28 20 70 72 6f 63 65 73 73 4f 72     if( processOr
16c00 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
16c10 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
16c20 79 2c 20 31 2c 20 26 73 4e 43 2e 68 61 73 41 67  y, 1, &sNC.hasAg
16c30 67 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  g) ){.      retu
16c40 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
16c50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
16c60 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f   processOrderGro
16c70 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  upBy(pParse, p, 
16c80 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 26 73 4e  pGroupBy, 0, &sN
16c90 43 2e 68 61 73 41 67 67 29 20 29 7b 0a 20 20 20  C.hasAgg) ){.   
16ca0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
16cb0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
16cc0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
16cd0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
16ce0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
16cf0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
16d00 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 47 52  Make sure the GR
16d10 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 64 6f  OUP BY clause do
16d20 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
16d30 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
16d40 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ns..  */.  if( p
16d50 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73  GroupBy ){.    s
16d60 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
16d70 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20  tem *pItem;.  . 
16d80 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
16d90 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69  m=pGroupBy->a; i
16da0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
16db0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
16dc0 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
16dd0 61 73 50 72 6f 70 65 72 74 79 28 70 49 74 65 6d  asProperty(pItem
16de0 2d 3e 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29  ->pExpr, EP_Agg)
16df0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16e00 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
16e10 73 65 2c 20 22 61 67 67 72 65 67 61 74 65 20 66  se, "aggregate f
16e20 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  unctions are not
16e30 20 61 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20   allowed in ".  
16e40 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20 47            "the G
16e50 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 22 29  ROUP BY clause")
16e60 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
16e70 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
16e80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16e90 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
16ea0 73 20 6f 6e 65 20 53 45 4c 45 43 54 20 6f 66 20  s one SELECT of 
16eb0 61 20 63 6f 6d 70 6f 75 6e 64 2c 20 62 65 20 73  a compound, be s
16ec0 75 72 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 6e  ure to resolve n
16ed0 61 6d 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ames.  ** in the
16ee0 20 6f 74 68 65 72 20 53 45 4c 45 43 54 73 2e 0a   other SELECTs..
16ef0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50    */.  if( p->pP
16f00 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rior ){.    retu
16f10 72 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  rn sqlite3Select
16f20 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20  Resolve(pParse, 
16f30 70 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 75 74 65  p->pPrior, pOute
16f40 72 4e 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rNC);.  }else{. 
16f50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16f60 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
16f70 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72  * Reset the aggr
16f80 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
16f90 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67  r..**.** The agg
16fa0 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
16fb0 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d  or is a set of m
16fc0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74  emory cells that
16fd0 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65   hold.** interme
16fe0 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68  diate results wh
16ff0 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20  ile calculating 
17000 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54  an aggregate.  T
17010 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73  his.** routine s
17020 69 6d 70 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c  imply stores NUL
17030 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f  Ls in all of tho
17040 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e  se memory cells.
17050 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17060 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
17070 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
17080 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
17090 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
170a0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
170b0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
170c0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
170d0 46 75 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67  Func;.  if( pAgg
170e0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67  Info->nFunc+pAgg
170f0 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30  Info->nColumn==0
17100 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
17110 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
17120 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
17130 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  mn; i++){.    sq
17140 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17150 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
17160 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
17170 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f  .iMem);.  }.  fo
17180 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f  r(pFunc=pAggInfo
17190 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c  ->aFunc, i=0; i<
171a0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
171b0 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a   i++, pFunc++){.
171c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
171d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
171e0 2c 20 30 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d  , 0, pFunc->iMem
171f0 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  );.    if( pFunc
17200 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
17210 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
17220 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b   = pFunc->pExpr;
17230 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 70  .      if( pE->p
17240 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70  List==0 || pE->p
17250 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
17260 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17270 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
17280 2c 20 22 44 49 53 54 49 4e 43 54 20 69 6e 20 61  , "DISTINCT in a
17290 67 67 72 65 67 61 74 65 20 6d 75 73 74 20 62 65  ggregate must be
172a0 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20 20 20 20   followed ".    
172b0 20 20 20 20 20 20 20 22 62 79 20 61 6e 20 65 78         "by an ex
172c0 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20  pression");.    
172d0 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74      pFunc->iDist
172e0 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
172f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17300 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
17310 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
17320 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
17330 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  pE->pList);.    
17340 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17350 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
17360 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63  Ephemeral, pFunc
17370 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20  ->iDistinct, 0, 
17380 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
17390 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
173a0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
173b0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
173c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
173d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
173e0 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46  voke the OP_AggF
173f0 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66  inalize opcode f
17400 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61  or every aggrega
17410 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  te function.** i
17420 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74  n the AggInfo st
17430 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
17440 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65  ic void finalize
17450 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72  AggFunctions(Par
17460 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
17470 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
17480 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
17490 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
174a0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
174b0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
174c0 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
174d0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
174e0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
174f0 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
17500 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
17510 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c   = pF->pExpr->pL
17520 69 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ist;.    sqlite3
17530 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
17540 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69  _AggFinal, pF->i
17550 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69  Mem, pList ? pLi
17560 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30  st->nExpr : 0, 0
17570 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17580 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
17590 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
175a0 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  CDEF);.  }.}../*
175b0 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61  .** Update the a
175c0 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72  ccumulator memor
175d0 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61  y cells for an a
175e0 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f  ggregate based o
175f0 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  n.** the current
17600 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
17610 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
17620 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
17630 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
17640 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
17650 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
17660 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
17670 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
17680 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
17690 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67  *pF;.  struct Ag
176a0 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a  gInfo_col *pC;..
176b0 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
176c0 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f  ctMode = 1;.  fo
176d0 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
176e0 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
176f0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
17700 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e  +, pF++){.    in
17710 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  t nArg;.    int 
17720 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20  addrNext = 0;.  
17730 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20    int regAgg;.  
17740 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
17750 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70  t = pF->pExpr->p
17760 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c  List;.    if( pL
17770 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72  ist ){.      nAr
17780 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  g = pList->nExpr
17790 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
177a0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
177b0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72  ange(pParse, nAr
177c0 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
177d0 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
177e0 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  t(pParse, pList,
177f0 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 65   regAgg);.    }e
17800 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  lse{.      nArg 
17810 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67  = 0;.      regAg
17820 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
17830 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e   if( pF->iDistin
17840 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ct>=0 ){.      a
17850 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65  ddrNext = sqlite
17860 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
17870 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17880 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20   nArg==1 );.    
17890 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
178a0 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74  Parse, pF->iDist
178b0 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20  inct, addrNext, 
178c0 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20  1, regAgg);.    
178d0 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46  }.    if( pF->pF
178e0 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71  unc->needCollSeq
178f0 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
17900 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
17910 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
17920 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
17930 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
17940 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
17950 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73  t!=0 );  /* pLis
17960 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e  t!=0 if pF->pFun
17970 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 69  c->needCollSeq i
17980 73 20 74 72 75 65 20 2a 2f 0a 20 20 20 20 20 20  s true */.      
17990 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
179a0 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20  List->a; !pColl 
179b0 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20  && j<nArg; j++, 
179c0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
179d0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
179e0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
179f0 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
17a00 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
17a10 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
17a20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
17a30 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
17a40 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
17a50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17a60 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
17a70 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28  lSeq, 0, 0, 0, (
17a80 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
17a90 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d  _COLLSEQ);.    }
17aa0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17ab0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67  AddOp4(v, OP_Agg
17ac0 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c  Step, 0, regAgg,
17ad0 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20   pF->iMem,.     
17ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17af0 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
17b00 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
17b10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
17b20 68 61 6e 67 65 50 35 28 76 2c 20 6e 41 72 67 29  hangeP5(v, nArg)
17b30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
17b40 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
17b50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
17b60 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  rg);.    if( add
17b70 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73  rNext ){.      s
17b80 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
17b90 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65  eLabel(v, addrNe
17ba0 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  xt);.    }.  }. 
17bb0 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67   for(i=0, pC=pAg
17bc0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70  gInfo->aCol; i<p
17bd0 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75  AggInfo->nAccumu
17be0 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b  lator; i++, pC++
17bf0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
17c00 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
17c10 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d  C->pExpr, pC->iM
17c20 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49  em);.  }.  pAggI
17c30 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
17c40 3d 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  = 0;.}..#ifndef 
17c50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
17c60 47 45 52 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  GER./*.** This f
17c70 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
17c80 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74  when a SELECT st
17c90 61 74 65 6d 65 6e 74 20 69 73 20 75 73 65 64 20  atement is used 
17ca0 74 6f 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 74  to create a.** t
17cb0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 66  emporary table f
17cc0 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
17cd0 6f 75 67 68 20 77 68 65 6e 20 72 75 6e 6e 69 6e  ough when runnin
17ce0 67 20 61 6e 20 49 4e 53 54 45 41 44 20 4f 46 0a  g an INSTEAD OF.
17cf0 2a 2a 20 55 50 44 41 54 45 20 6f 72 20 49 4e 53  ** UPDATE or INS
17d00 54 45 41 44 20 4f 46 20 44 45 4c 45 54 45 20 74  TEAD OF DELETE t
17d10 72 69 67 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49  rigger. .**.** I
17d20 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20  f possible, the 
17d30 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
17d40 20 69 73 20 6d 6f 64 69 66 69 65 64 20 73 6f 20   is modified so 
17d50 74 68 61 74 20 4e 55 4c 4c 20 76 61 6c 75 65 73  that NULL values
17d60 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
17d70 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
17d80 74 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 63 6f  table for all co
17d90 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20  lumns for which 
17da0 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  the .** correspo
17db0 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67  nding bit in arg
17dc0 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 6e 6f  ument mask is no
17dd0 74 20 73 65 74 2e 20 49 66 20 6d 61 73 6b 20 74  t set. If mask t
17de0 61 6b 65 73 20 74 68 65 0a 2a 2a 20 73 70 65 63  akes the.** spec
17df0 69 61 6c 20 76 61 6c 75 65 20 30 78 66 66 66 66  ial value 0xffff
17e00 66 66 66 66 2c 20 74 68 65 6e 20 61 6c 6c 20 63  ffff, then all c
17e10 6f 6c 75 6d 6e 73 20 61 72 65 20 70 6f 70 75 6c  olumns are popul
17e20 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
17e30 6c 69 74 65 33 53 65 6c 65 63 74 4d 61 73 6b 28  lite3SelectMask(
17e40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
17e50 65 6c 65 63 74 20 2a 70 2c 20 75 33 32 20 6d 61  elect *p, u32 ma
17e60 73 6b 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20  sk){.  if( p && 
17e70 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 21 70  !p->pPrior && !p
17e80 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20  ->isDistinct && 
17e90 6d 61 73 6b 21 3d 30 78 66 66 66 66 66 66 66 66  mask!=0xffffffff
17ea0 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
17eb0 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 6e   *pEList;.    in
17ec0 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t i;.    sqlite3
17ed0 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50  SelectResolve(pP
17ee0 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 20  arse, p, 0);.   
17ef0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
17f00 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ist;.    for(i=0
17f10 3b 20 70 45 4c 69 73 74 20 26 26 20 69 3c 70 45  ; pEList && i<pE
17f20 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 26 20 69  List->nExpr && i
17f30 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  <32; i++){.     
17f40 20 69 66 28 20 21 28 6d 61 73 6b 26 28 28 75 33   if( !(mask&((u3
17f50 32 29 31 3c 3c 69 29 29 20 29 7b 0a 20 20 20 20  2)1<<i)) ){.    
17f60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
17f70 65 6c 65 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b  elete(pEList->a[
17f80 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
17f90 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e     pEList->a[i].
17fa0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
17fb0 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  xpr(pParse->db, 
17fc0 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30  TK_NULL, 0, 0, 0
17fd0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
17fe0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
17ff0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
18000 64 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  de for the given
18010 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
18020 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  t..**.** The res
18030 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62  ults are distrib
18040 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20  uted in various 
18050 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  ways depending o
18060 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  n the.** content
18070 73 20 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44  s of the SelectD
18080 65 73 74 20 73 74 72 75 63 74 75 72 65 20 70 6f  est structure po
18090 69 6e 74 65 64 20 74 6f 20 62 79 20 61 72 67 75  inted to by argu
180a0 6d 65 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73  ment pDest.** as
180b0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
180c0 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
180d0 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20      Result.**   
180e0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20    ------------  
180f0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
18100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
18120 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63       SRT_Callbac
18130 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20  k    Invoke the 
18140 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63  callback for eac
18150 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  h row of the res
18160 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ult..**.**     S
18170 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53  RT_Mem         S
18180 74 6f 72 65 20 66 69 72 73 74 20 72 65 73 75 6c  tore first resul
18190 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t in memory cell
181a0 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 0a 2a 2a   pDest->iParm.**
181b0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20  .**     SRT_Set 
181c0 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 6e 6f          Store no
181d0 6e 2d 6e 75 6c 6c 20 72 65 73 75 6c 74 73 20 61  n-null results a
181e0 73 20 6b 65 79 73 20 6f 66 20 74 61 62 6c 65 20  s keys of table 
181f0 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a  pDest->iParm. .*
18200 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
18210 20 20 20 20 20 20 41 70 70 6c 79 20 74 68 65 20        Apply the 
18220 61 66 66 69 6e 69 74 79 20 70 44 65 73 74 2d 3e  affinity pDest->
18230 61 66 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20  affinity before 
18240 73 74 6f 72 69 6e 67 20 74 68 65 6d 2e 0a 2a 2a  storing them..**
18250 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f  .**     SRT_Unio
18260 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  n       Store re
18270 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69  sults as a key i
18280 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
18290 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ble pDest->iParm
182a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
182b0 45 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f  Except      Remo
182c0 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ve results from 
182d0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
182e0 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ble pDest->iParm
182f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
18300 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72  Table       Stor
18310 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d  e results in tem
18320 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65  porary table pDe
18330 73 74 2d 3e 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20  st->iParm.**.** 
18340 20 20 20 20 53 52 54 5f 45 70 68 65 6d 54 61 62      SRT_EphemTab
18350 20 20 20 20 43 72 65 61 74 65 20 61 6e 20 74 65      Create an te
18360 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
18370 65 73 74 2d 3e 69 50 61 72 6d 20 61 6e 64 20 73  est->iParm and s
18380 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  tore.**         
18390 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
183a0 72 65 73 75 6c 74 20 74 68 65 72 65 2e 20 54 68  result there. Th
183b0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
183c0 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20 20   open after.**  
183d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183e0 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a     returning..**
183f0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 75 62 72  .**     SRT_Subr
18400 6f 75 74 69 6e 65 20 20 46 6f 72 20 65 61 63 68  outine  For each
18410 20 72 6f 77 20 72 65 74 75 72 6e 65 64 2c 20 70   row returned, p
18420 75 73 68 20 74 68 65 20 72 65 73 75 6c 74 73 20  ush the results 
18430 6f 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  onto the.**     
18440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18450 76 64 62 65 20 73 74 61 63 6b 20 61 6e 64 20 63  vdbe stack and c
18460 61 6c 6c 20 74 68 65 20 73 75 62 72 6f 75 74 69  all the subrouti
18470 6e 65 20 28 76 69 61 20 4f 50 5f 47 6f 73 75 62  ne (via OP_Gosub
18480 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ).**            
18490 20 20 20 20 20 20 20 20 20 61 74 20 61 64 64 72           at addr
184a0 65 73 73 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ess pDest->iParm
184b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
184c0 45 78 69 73 74 73 20 20 20 20 20 20 53 74 6f 72  Exists      Stor
184d0 65 20 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79 20  e a 1 in memory 
184e0 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61 72  cell pDest->iPar
184f0 6d 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 0a  m if the result.
18500 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
18510 20 20 20 20 20 20 20 73 65 74 20 69 73 20 6e 6f         set is no
18520 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20  t empty..**.**  
18530 20 20 20 53 52 54 5f 44 69 73 63 61 72 64 20 20     SRT_Discard  
18540 20 20 20 54 68 72 6f 77 20 74 68 65 20 72 65 73     Throw the res
18550 75 6c 74 73 20 61 77 61 79 2e 0a 2a 2a 0a 2a 2a  ults away..**.**
18560 20 53 65 65 20 74 68 65 20 73 65 6c 65 63 74 49   See the selectI
18570 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74  nnerLoop() funct
18580 69 6f 6e 20 66 6f 72 20 61 20 63 61 6e 6f 6e 69  ion for a canoni
18590 63 61 6c 20 6c 69 73 74 69 6e 67 20 6f 66 20 74  cal listing of t
185a0 68 65 20 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 76  he .** allowed v
185b0 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74 20 61  alues of eDest a
185c0 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69 6e 67  nd their meaning
185d0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
185e0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
185f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
18600 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
18610 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
18620 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
18630 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
18640 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
18650 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
18660 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
18670 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
18680 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
18690 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
186a0 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
186b0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
186c0 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
186d0 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50  at..**.** The pP
186e0 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62  arent, parentTab
186f0 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67  , and *pParentAg
18700 67 20 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c  g fields are fil
18710 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a  led in if this.*
18720 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20 73 75  * SELECT is a su
18730 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f  bquery.  This ro
18740 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f  utine may try to
18750 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45   combine this SE
18760 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73  LECT.** with its
18770 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20   parent to form 
18780 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75  a single flat qu
18790 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e  ery.  In so doin
187a0 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63  g, it might.** c
187b0 68 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74  hange the parent
187c0 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f   query from a no
187d0 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20 61  n-aggregate to a
187e0 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
187f0 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72  y..** For that r
18800 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65  eason, the pPare
18810 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20 70 61  ntAgg flag is pa
18820 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  ssed as a pointe
18830 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20  r, so it.** can 
18840 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  be changed..**.*
18850 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 20 54  * Example 1:   T
18860 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
18870 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65  e pParent parame
18880 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ter..**.**    SE
18890 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a  LECT * FROM t1 J
188a0 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c 20 63  OIN (SELECT x, c
188b0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29  ount(*) FROM t2)
188c0 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20   JOIN t3;.**    
188d0 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
188e0 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20         \_______ 
188f0 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  subquery _______
18900 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20  /        /.**   
18910 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
18920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18940 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20           /.**   
18950 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
18960 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
18970 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
18980 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20  ________/.**.** 
18990 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
189a0 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 6f  called for the o
189b0 75 74 65 72 20 71 75 65 72 79 20 66 69 72 73 74  uter query first
189c0 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63 61 6c  .   For that cal
189d0 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77 69  l,.** pParent wi
189e0 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72  ll be NULL.  Dur
189f0 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73 69  ing the processi
18a00 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  ng of the outer 
18a10 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20  query, this .** 
18a20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
18a30 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f  d recursively to
18a40 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75 62 71   handle the subq
18a50 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65 20 72  uery.  For the r
18a60 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c  ecursive.** call
18a70 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 70  , pParent will p
18a80 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 65  oint to the oute
18a90 72 20 71 75 65 72 79 2e 20 20 42 65 63 61 75 73  r query.  Becaus
18aa0 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  e the subquery i
18ab0 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20  s.** the second 
18ac0 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74 68 72  element in a thr
18ad0 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65  ee-way join, the
18ae0 20 70 61 72 65 6e 74 54 61 62 20 70 61 72 61 6d   parentTab param
18af0 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  eter will.** be 
18b00 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c 75 65  1 (the 2nd value
18b10 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65 64 20   of a 0-indexed 
18b20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73  array.).*/.int s
18b30 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20  qlite3Select(.  
18b40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
18b50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
18b60 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
18b70 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
18b80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18b90 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
18ba0 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
18bb0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
18bc0 44 65 73 74 2c 20 20 20 20 20 2f 2a 20 57 68 61  Dest,     /* Wha
18bd0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
18be0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
18bf0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72  /.  Select *pPar
18c00 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e  ent,       /* An
18c10 6f 74 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72  other SELECT for
18c20 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20 61   which this is a
18c30 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20   sub-query */.  
18c40 69 6e 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20  int parentTab,  
18c50 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
18c60 69 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63  in pParent->pSrc
18c70 20 6f 66 20 74 68 69 73 20 71 75 65 72 79 20 2a   of this query *
18c80 2f 0a 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74  /.  int *pParent
18c90 41 67 67 2c 20 20 20 20 20 20 20 2f 2a 20 54 72  Agg,       /* Tr
18ca0 75 65 20 69 66 20 70 50 61 72 65 6e 74 20 75 73  ue if pParent us
18cb0 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
18cc0 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72  ctions */.  char
18cd0 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20   *aff           
18ce0 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69     /* If eDest i
18cf0 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65  s SRT_Union, the
18d00 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
18d10 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
18d20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
18d30 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
18d40 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
18d50 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  *pWInfo;     /* 
18d60 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69  Return from sqli
18d70 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
18d80 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
18d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18da0 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
18db0 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ne under constru
18dc0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
18dd0 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20  sAgg;           
18de0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65    /* True for se
18df0 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20  lect lists like 
18e00 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20  "count(*)" */.  
18e10 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
18e20 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
18e30 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74  f columns to ext
18e40 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69  ract. */.  SrcLi
18e50 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
18e60 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
18e70 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72  les to select fr
18e80 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  om */.  Expr *pW
18e90 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f  here;          /
18ea0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
18eb0 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
18ec0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
18ed0 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20  pOrderBy;    /* 
18ee0 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
18ef0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
18f00 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
18f10 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a  *pGroupBy;    /*
18f20 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
18f30 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
18f40 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48  LL */.  Expr *pH
18f50 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  aving;         /
18f60 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61  * The HAVING cla
18f70 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
18f80 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73  L */.  int isDis
18f90 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
18fa0 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
18fb0 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
18fc0 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
18fd0 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20  t distinct;     
18fe0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
18ff0 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
19000 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69  tinct set */.  i
19010 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
19020 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
19030 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
19040 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
19050 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64   int addrSortInd
19060 65 78 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  ex;     /* Addre
19070 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e  ss of an OP_Open
19080 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
19090 63 74 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e  ction */.  AggIn
190a0 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20  fo sAggInfo;    
190b0 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
190c0 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61   used by aggrega
190d0 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  te queries */.  
190e0 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20  int iEnd;       
190f0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
19100 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20  s of the end of 
19110 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73  the query */.  s
19120 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
19130 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
19140 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
19150 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72   */..  db = pPar
19160 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d  se->db;.  if( p=
19170 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
19180 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
19190 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65  ->nErr ){.    re
191a0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
191b0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
191c0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
191d0 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
191e0 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  0) ) return 1;. 
191f0 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66   memset(&sAggInf
19200 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67  o, 0, sizeof(sAg
19210 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 70 4f 72 64  gInfo));..  pOrd
19220 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
19230 42 79 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61  By;.  if( Ignora
19240 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
19250 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  ) ){.    p->pOrd
19260 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  erBy = 0;..    /
19270 2a 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  * In these cases
19280 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70   the DISTINCT op
19290 65 72 61 74 6f 72 20 6d 61 6b 65 73 20 6e 6f 20  erator makes no 
192a0 64 69 66 66 65 72 65 6e 63 65 20 74 6f 20 74 68  difference to th
192b0 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73  e.    ** results
192c0 2c 20 73 6f 20 72 65 6d 6f 76 65 20 69 74 20 69  , so remove it i
192d0 66 20 69 74 20 77 65 72 65 20 73 70 65 63 69 66  f it were specif
192e0 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ied..    */.    
192f0 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44  assert(pDest->eD
19300 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20  est==SRT_Exists 
19310 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
19320 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20  =SRT_Union || . 
19330 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
19340 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65  >eDest==SRT_Exce
19350 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  pt || pDest->eDe
19360 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 29  st==SRT_Discard)
19370 3b 0a 20 20 20 20 70 2d 3e 69 73 44 69 73 74 69  ;.    p->isDisti
19380 6e 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  nct = 0;.  }.  i
19390 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
193a0 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20  Resolve(pParse, 
193b0 70 2c 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74  p, 0) ){.    got
193c0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
193d0 7d 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  }.  p->pOrderBy 
193e0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 23 69 66  = pOrderBy;..#if
193f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19400 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
19410 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
19420 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65  s are a sequence
19430 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20   of queries, do 
19440 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73  the earlier ones
19450 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69   first..  */.  i
19460 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
19470 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68      if( p->pRigh
19480 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  tmost==0 ){.    
19490 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c    Select *pLoop,
194a0 20 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20   *pRight = 0;.  
194b0 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
194c0 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 53 65 6c  .      int mxSel
194d0 65 63 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ect;.      for(p
194e0 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
194f0 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
19500 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20  or, cnt++){.    
19510 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68      pLoop->pRigh
19520 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  tmost = p;.     
19530 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20     pLoop->pNext 
19540 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
19550 20 20 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70    pRight = pLoop
19560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19570 6d 78 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61  mxSelect = db->a
19580 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
19590 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
195a0 43 54 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d  CT];.      if( m
195b0 78 53 65 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d  xSelect && cnt>m
195c0 78 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  xSelect ){.     
195d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
195e0 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
195f0 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f  many terms in co
19600 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b  mpound SELECT");
19610 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
19620 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
19630 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
19640 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
19650 70 2c 20 70 44 65 73 74 2c 20 61 66 66 29 3b 0a  p, pDest, aff);.
19660 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
19670 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69   Make local copi
19680 65 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65  es of the parame
19690 74 65 72 73 20 66 6f 72 20 74 68 69 73 20 71 75  ters for this qu
196a0 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62  ery..  */.  pTab
196b0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
196c0 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
196d0 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79  here;.  pGroupBy
196e0 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
196f0 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
19700 48 61 76 69 6e 67 3b 0a 20 20 69 73 41 67 67 20  Having;.  isAgg 
19710 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 69 73  = p->isAgg;.  is
19720 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
19730 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 45 4c 69  Distinct;.  pELi
19740 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
19750 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
19760 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
19770 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44  d;..  /* .  ** D
19780 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d  o not even attem
19790 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  pt to generate a
197a0 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61  ny code if we ha
197b0 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a  ve already seen.
197c0 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f    ** errors befo
197d0 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
197e0 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69  starts..  */.  i
197f0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  f( pParse->nErr>
19800 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
19810 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72  end;..  /* If wr
19820 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20  iting to memory 
19830 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  or generating a 
19840 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20  set.  ** only a 
19850 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61  single column ma
19860 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  y be output..  *
19870 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
19880 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
19890 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c   if( checkForMul
198a0 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
198b0 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73  ror(pParse, pDes
198c0 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
198d0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  ) ){.    goto se
198e0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
198f0 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52  ndif..  /* ORDER
19900 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66   BY is ignored f
19910 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74  or some destinat
19920 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
19930 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62   IgnorableOrderb
19940 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
19950 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
19960 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  }..  /* Begin ge
19970 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
19980 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
19990 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
199a0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
199b0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
199c0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
199d0 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
199e0 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
199f0 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
19a00 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
19a10 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
19a20 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
19a30 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
19a40 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
19a50 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
19a60 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
19a70 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
19a80 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69  ntext = 0;.    i
19a90 6e 74 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f  nt needRestoreCo
19aa0 6e 74 65 78 74 3b 0a 20 20 20 20 73 74 72 75 63  ntext;.    struc
19ab0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
19ac0 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
19ad0 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c  t->a[i];.    Sel
19ae0 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 0a 20  ectDest dest;.. 
19af0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
19b00 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 49 74 65  elect==0 || pIte
19b10 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 29  m->isPopulated )
19b20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
19b30 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21  f( pItem->zName!
19b40 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76  =0 ){.      zSav
19b50 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
19b60 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
19b70 74 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72  text;.      pPar
19b80 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
19b90 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b   = pItem->zName;
19ba0 0a 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f  .      needResto
19bb0 72 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20  reContext = 1;. 
19bc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19bd0 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
19be0 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  xt = 0;.    }.  
19bf0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50    /* Increment P
19c00 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20  arse.nHeight by 
19c10 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68  the height of th
19c20 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73  e largest expres
19c30 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65  sion.    ** tree
19c40 20 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 74   refered to by t
19c50 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20  his, the parent 
19c60 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c  select. The chil
19c70 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20  d select.    ** 
19c80 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72  may contain expr
19c90 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20  ession trees of 
19ca0 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28  at most.    ** (
19cb0 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
19cc0 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69  DEPTH-Parse.nHei
19cd0 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69  ght) height. Thi
19ce0 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a  s is a bit.    *
19cf0 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74  * more conservat
19d00 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ive than necessa
19d10 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73  ry, but much eas
19d20 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69  ier than enforci
19d30 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61  ng.    ** an exa
19d40 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f  ct limit..    */
19d50 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
19d60 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  ight += sqlite3S
19d70 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
19d80 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  p);.    sqlite3S
19d90 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
19da0 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61  est, SRT_EphemTa
19db0 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  b, pItem->iCurso
19dc0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  r);.    sqlite3S
19dd0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 49  elect(pParse, pI
19de0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 26 64  tem->pSelect, &d
19df0 65 73 74 2c 20 70 2c 20 69 2c 20 26 69 73 41 67  est, p, i, &isAg
19e00 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64  g, 0);.    if( d
19e10 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19e20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
19e30 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
19e40 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
19e50 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65  ght -= sqlite3Se
19e60 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
19e70 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64 52  );.    if( needR
19e80 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 29 7b  estoreContext ){
19e90 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a  .      pParse->z
19ea0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
19eb0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
19ec0 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c  .    }.    pTabL
19ed0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
19ee0 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70     pWhere = p->p
19ef0 57 68 65 72 65 3b 0a 20 20 20 20 69 66 28 20 21  Where;.    if( !
19f00 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
19f10 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20  (pDest) ){.     
19f20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
19f30 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
19f40 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
19f50 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70  >pGroupBy;.    p
19f60 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
19f70 69 6e 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69  ing;.    isDisti
19f80 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
19f90 6e 63 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  nct;.  }.#endif.
19fa0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
19fb0 65 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ee if this is a 
19fc0 73 75 62 71 75 65 72 79 20 74 68 61 74 20 63 61  subquery that ca
19fd0 6e 20 62 65 20 22 66 6c 61 74 74 65 6e 65 64 22  n be "flattened"
19fe0 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74   into its parent
19ff0 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74 74 65  ..  ** If flatte
1a000 6e 69 6e 67 20 69 73 20 61 20 70 6f 73 73 69 62  ning is a possib
1a010 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64 20  lity, do so and 
1a020 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
1a030 6c 79 2e 20 20 0a 20 20 2a 2f 0a 23 69 66 6e 64  ly.  .  */.#ifnd
1a040 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1a050 49 45 57 0a 20 20 69 66 28 20 70 50 61 72 65 6e  IEW.  if( pParen
1a060 74 20 26 26 20 70 50 61 72 65 6e 74 41 67 67 20  t && pParentAgg 
1a070 26 26 0a 20 20 20 20 20 20 66 6c 61 74 74 65 6e  &&.      flatten
1a080 53 75 62 71 75 65 72 79 28 64 62 2c 20 70 50 61  Subquery(db, pPa
1a090 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c  rent, parentTab,
1a0a0 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73   *pParentAgg, is
1a0b0 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Agg) ){.    if( 
1a0c0 69 73 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74  isAgg ) *pParent
1a0d0 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  Agg = 1;.    got
1a0e0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1a0f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
1a100 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 77 72  f possible, rewr
1a110 69 74 65 20 74 68 65 20 71 75 65 72 79 20 74 6f  ite the query to
1a120 20 75 73 65 20 47 52 4f 55 50 20 42 59 20 69 6e   use GROUP BY in
1a130 73 74 65 61 64 20 6f 66 20 44 49 53 54 49 4e 43  stead of DISTINC
1a140 54 2e 0a 20 20 2a 2a 20 47 52 4f 55 50 20 42 59  T..  ** GROUP BY
1a150 20 6d 61 79 20 75 73 65 20 61 6e 20 69 6e 64 65   may use an inde
1a160 78 2c 20 44 49 53 54 49 4e 43 54 20 6e 65 76 65  x, DISTINCT neve
1a170 72 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  r does..  */.  i
1a180 66 28 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  f( p->isDistinct
1a190 20 26 26 20 21 70 2d 3e 69 73 41 67 67 20 26 26   && !p->isAgg &&
1a1a0 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b   !p->pGroupBy ){
1a1b0 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79  .    p->pGroupBy
1a1c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1a1d0 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
1a1e0 69 73 74 29 3b 0a 20 20 20 20 70 47 72 6f 75 70  ist);.    pGroup
1a1f0 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
1a200 3b 0a 20 20 20 20 70 2d 3e 69 73 44 69 73 74 69  ;.    p->isDisti
1a210 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 69 73 44  nct = 0;.    isD
1a220 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 7d  istinct = 0;.  }
1a230 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
1a240 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
1a250 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 69 73  lause, then this
1a260 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e   sorting.  ** in
1a270 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70  dex might end up
1a280 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66   being unused if
1a290 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62 65   the data can be
1a2a0 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64   .  ** extracted
1a2b0 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f   in pre-sorted o
1a2c0 72 64 65 72 2e 20 20 49 66 20 74 68 61 74 20 69  rder.  If that i
1a2d0 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
1a2e0 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65   the.  ** OP_Ope
1a2f0 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
1a300 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63  uction will be c
1a310 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f  hanged to an OP_
1a320 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77  Noop once.  ** w
1a330 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61  e figure out tha
1a340 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  t the sorting in
1a350 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65  dex is not neede
1a360 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f 72 74  d.  The addrSort
1a370 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61  Index.  ** varia
1a380 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 66  ble is used to f
1a390 61 63 69 6c 69 74 61 74 65 20 74 68 61 74 20 63  acilitate that c
1a3a0 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  hange..  */.  if
1a3b0 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
1a3c0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1a3d0 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  nfo;.    pKeyInf
1a3e0 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
1a3f0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1a400 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70  pOrderBy);.    p
1a410 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
1a420 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
1a430 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f  ++;.    p->addrO
1a440 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64  penEphm[2] = add
1a450 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20  rSortIndex =.   
1a460 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a470 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
1a480 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4a0 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69       pOrderBy->i
1a4b0 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42  ECursor, pOrderB
1a4c0 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20  y->nExpr+2, 0,. 
1a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4e0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
1a4f0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
1a500 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
1a510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
1a520 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b  rSortIndex = -1;
1a530 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
1a540 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74  e output is dest
1a550 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f  ined for a tempo
1a560 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e  rary table, open
1a570 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a   that table..  *
1a580 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65  /.  if( pDest->e
1a590 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
1a5a0 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
1a5b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a5c0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
1a5d0 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 70   pDest->iParm, p
1a5e0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
1a5f0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
1a600 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20   limiter..  */. 
1a610 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
1a620 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1a630 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
1a640 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
1a650 20 70 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a   p, iEnd);..  /*
1a660 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20   Open a virtual 
1a670 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
1a680 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
1a690 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  t..  */.  if( is
1a6a0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
1a6b0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1a6c0 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  o;.    assert( i
1a6d0 73 41 67 67 20 7c 7c 20 70 47 72 6f 75 70 42 79  sAgg || pGroupBy
1a6e0 20 29 3b 0a 20 20 20 20 64 69 73 74 69 6e 63 74   );.    distinct
1a6f0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1a700 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  +;.    pKeyInfo 
1a710 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
1a720 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d  rList(pParse, p-
1a730 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71  >pEList);.    sq
1a740 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1a750 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
1a760 72 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30  ral, distinct, 0
1a770 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1a780 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
1a790 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
1a7a0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
1a7b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1a7c0 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  distinct = -1;. 
1a7d0 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61   }..  /* Aggrega
1a7e0 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65  te and non-aggre
1a7f0 67 61 74 65 20 71 75 65 72 69 65 73 20 61 72 65  gate queries are
1a800 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
1a810 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69  ntly */.  if( !i
1a820 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79  sAgg && pGroupBy
1a830 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
1a840 69 73 20 63 61 73 65 20 69 73 20 66 6f 72 20 6e  is case is for n
1a850 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65  on-aggregate que
1a860 72 69 65 73 0a 20 20 20 20 2a 2a 20 42 65 67 69  ries.    ** Begi
1a870 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
1a880 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  can.    */.    p
1a890 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
1a8a0 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
1a8b0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
1a8c0 72 65 2c 20 26 70 4f 72 64 65 72 42 79 2c 20 30  re, &pOrderBy, 0
1a8d0 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
1a8e0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
1a8f0 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20  ct_end;..    /* 
1a900 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  If sorting index
1a910 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65   that was create
1a920 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f  d by a prior OP_
1a930 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20  OpenEphemeral . 
1a940 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
1a950 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62  n ended up not b
1a960 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65  eing needed, the
1a970 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  n change the OP_
1a980 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20  OpenEphemeral.  
1a990 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f    ** into an OP_
1a9a0 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Noop..    */.   
1a9b0 20 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64   if( addrSortInd
1a9c0 65 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42  ex>=0 && pOrderB
1a9d0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  y==0 ){.      sq
1a9e0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
1a9f0 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72  oNoop(v, addrSor
1aa00 74 49 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20 20  tIndex, 1);.    
1aa10 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
1aa20 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  m[2] = -1;.    }
1aa30 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
1aa40 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
1aa50 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20 20  loop.    */.    
1aa60 61 73 73 65 72 74 28 21 69 73 44 69 73 74 69 6e  assert(!isDistin
1aa70 63 74 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 49  ct);.    selectI
1aa80 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
1aa90 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30   p, pEList, 0, 0
1aaa0 2c 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20  , pOrderBy, -1, 
1aab0 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
1aac0 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
1aad0 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57  o->iContinue, pW
1aae0 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 61 66  Info->iBreak, af
1aaf0 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20  f);..    /* End 
1ab00 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
1ab10 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
1ab20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
1ab30 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65  nd(pWInfo);.  }e
1ab40 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
1ab50 20 69 73 20 74 68 65 20 70 72 6f 63 65 73 73 69   is the processi
1ab60 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
1ab70 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20 20   queries */.    
1ab80 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
1ab90 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
1aba0 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ext for processi
1abb0 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66  ng aggregate inf
1abc0 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
1abd0 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20  int iAMem;      
1abe0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
1abf0 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f   address for sto
1ac00 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f  ring current GRO
1ac10 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
1ac20 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iBMem;         
1ac30 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
1ac40 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f  dress for previo
1ac50 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  us GROUP BY */. 
1ac60 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b     int iUseFlag;
1ac70 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64         /* Mem ad
1ac80 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c  dress holding fl
1ac90 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  ag indicating th
1aca0 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20  at at least.    
1acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acc0 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f      ** one row o
1acd0 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74  f the input to t
1ace0 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61  he aggregator ha
1acf0 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20  s been.         
1ad00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1ad10 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  * processed */. 
1ad20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61     int iAbortFla
1ad30 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64  g;     /* Mem ad
1ad40 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73  dress which caus
1ad50 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69  es query abort i
1ad60 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20  f positive */.  
1ad70 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72    int groupBySor
1ad80 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f  t;    /* Rows co
1ad90 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69  me from source i
1ada0 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
1adb0 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 20 54 68 65   */...    /* The
1adc0 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
1add0 62 6c 65 73 20 68 6f 6c 64 20 61 64 64 72 65 73  bles hold addres
1ade0 73 65 73 20 6f 72 20 6c 61 62 65 6c 73 20 66 6f  ses or labels fo
1adf0 72 20 70 61 72 74 73 20 6f 66 20 74 68 65 0a 20  r parts of the. 
1ae00 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61     ** virtual ma
1ae10 63 68 69 6e 65 20 70 72 6f 67 72 61 6d 20 77 65  chine program we
1ae20 20 61 72 65 20 70 75 74 74 69 6e 67 20 74 6f 67   are putting tog
1ae30 65 74 68 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ether */.    int
1ae40 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20   addrOutputRow; 
1ae50 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
1ae60 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
1ae70 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c   outputs a resul
1ae80 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  t row */.    int
1ae90 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20   addrSetAbort;  
1aea0 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
1aeb0 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72  abort flag and r
1aec0 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  eturn */.    int
1aed0 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c   addrInitializeL
1aee0 6f 6f 70 3b 20 2f 2a 20 53 74 61 72 74 20 6f 66  oop; /* Start of
1aef0 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74 69   code that initi
1af00 61 6c 69 7a 65 73 20 74 68 65 20 69 6e 70 75 74  alizes the input
1af10 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74   loop */.    int
1af20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20   addrTopOfLoop; 
1af30 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
1af40 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f  he input loop */
1af50 0a 20 20 20 20 69 6e 74 20 61 64 64 72 47 72 6f  .    int addrGro
1af60 75 70 42 79 43 68 61 6e 67 65 3b 20 20 2f 2a 20  upByChange;  /* 
1af70 43 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77  Code that runs w
1af80 68 65 6e 20 61 6e 79 20 47 52 4f 55 50 20 42 59  hen any GROUP BY
1af90 20 74 65 72 6d 20 63 68 61 6e 67 65 73 20 2a 2f   term changes */
1afa0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 50 72 6f  .    int addrPro
1afb0 63 65 73 73 52 6f 77 3b 20 20 20 20 20 2f 2a 20  cessRow;     /* 
1afc0 43 6f 64 65 20 74 6f 20 70 72 6f 63 65 73 73 20  Code to process 
1afd0 61 20 73 69 6e 67 6c 65 20 69 6e 70 75 74 20 72  a single input r
1afe0 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  ow */.    int ad
1aff0 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  drEnd;          
1b000 20 20 2f 2a 20 45 6e 64 20 6f 66 20 61 6c 6c 20    /* End of all 
1b010 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20  processing */.  
1b020 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e    int addrSortin
1b030 67 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65  gIdx;     /* The
1b040 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1b050 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e  l for the sortin
1b060 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  g index */.    i
1b070 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20  nt addrReset;   
1b080 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75         /* Subrou
1b090 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69  tine for resetti
1b0a0 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ng the accumulat
1b0b0 6f 72 20 2a 2f 0a 0a 20 20 20 20 61 64 64 72 45  or */..    addrE
1b0c0 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
1b0d0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
1b0e0 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b     /* Convert TK
1b0f0 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e  _COLUMN nodes in
1b100 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
1b110 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65   and make entrie
1b120 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67  s in.    ** sAgg
1b130 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f  Info for all TK_
1b140 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64  AGG_FUNCTION nod
1b150 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  es in expression
1b160 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
1b170 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1b180 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d  ..    */.    mem
1b190 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
1b1a0 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73  eof(sNC));.    s
1b1b0 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
1b1c0 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  se;.    sNC.pSrc
1b1d0 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
1b1e0 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66  .    sNC.pAggInf
1b1f0 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20  o = &sAggInfo;. 
1b200 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72     sAggInfo.nSor
1b210 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72  tingColumn = pGr
1b220 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79  oupBy ? pGroupBy
1b230 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20  ->nExpr+1 : 0;. 
1b240 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f     sAggInfo.pGro
1b250 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b  upBy = pGroupBy;
1b260 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1b270 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
1b280 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  sNC, pEList);.  
1b290 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
1b2a0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
1b2b0 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
1b2c0 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
1b2d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b2e0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
1b2f0 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67  es(&sNC, pHaving
1b300 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  );.    }.    sAg
1b310 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74  gInfo.nAccumulat
1b320 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43  or = sAggInfo.nC
1b330 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69  olumn;.    for(i
1b340 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
1b350 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
1b360 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
1b370 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
1b380 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
1b390 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74  [i].pExpr->pList
1b3a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1b3b0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1b3c0 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
1b3d0 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  end;..    /* Pro
1b3e0 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
1b3f0 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55  egates with GROU
1b400 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66  P BY is very dif
1b410 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a  ferent and.    *
1b420 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70  * much more comp
1b430 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61  lex than aggrega
1b440 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52  tes without a GR
1b450 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20  OUP BY..    */. 
1b460 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
1b470 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  ){.      KeyInfo
1b480 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20   *pKeyInfo;  /* 
1b490 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  Keying informati
1b4a0 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70  on for the group
1b4b0 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20   by clause */.. 
1b4c0 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6c       /* Create l
1b4d0 61 62 65 6c 73 20 74 68 61 74 20 77 65 20 77 69  abels that we wi
1b4e0 6c 6c 20 62 65 20 6e 65 65 64 69 6e 67 0a 20 20  ll be needing.  
1b4f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20      */.     .   
1b500 20 20 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a     addrInitializ
1b510 65 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  eLoop = sqlite3V
1b520 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1b530 0a 20 20 20 20 20 20 61 64 64 72 47 72 6f 75 70  .      addrGroup
1b540 42 79 43 68 61 6e 67 65 20 3d 20 73 71 6c 69 74  ByChange = sqlit
1b550 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1b560 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72 50 72  v);.      addrPr
1b570 6f 63 65 73 73 52 6f 77 20 3d 20 73 71 6c 69 74  ocessRow = sqlit
1b580 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1b590 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  v);..      /* If
1b5a0 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55   there is a GROU
1b5b0 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d  P BY clause we m
1b5c0 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74  ight need a sort
1b5d0 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20  ing index to.   
1b5e0 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20     ** implement 
1b5f0 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68  it.  Allocate th
1b600 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  at sorting index
1b610 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72   now.  If it tur
1b620 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20  ns out.      ** 
1b630 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e  that we do not n
1b640 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c  eed it after all
1b650 2c 20 74 68 65 20 4f 70 65 6e 45 70 68 65 6d 65  , the OpenEpheme
1b660 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  ral instruction.
1b670 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
1b680 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
1b690 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20  a Noop.  .      
1b6a0 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66  */.      sAggInf
1b6b0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70  o.sortingIdx = p
1b6c0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
1b6d0 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
1b6e0 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
1b6f0 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ist(pParse, pGro
1b700 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64  upBy);.      add
1b710 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 0a 20 20  rSortingIdx =.  
1b720 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1b730 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1b740 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 73  OpenEphemeral, s
1b750 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
1b760 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  dx,.            
1b770 20 20 20 20 20 20 20 20 20 20 20 20 20 73 41 67               sAg
1b780 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
1b790 6c 75 6d 6e 2c 20 30 2c 0a 20 20 20 20 20 20 20  lumn, 0,.       
1b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7b0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
1b7c0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
1b7d0 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f  NDOFF);..      /
1b7e0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d  * Initialize mem
1b7f0 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73  ory locations us
1b800 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61  ed by GROUP BY a
1b810 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73  ggregate process
1b820 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ing.      */.   
1b830 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b     iUseFlag = ++
1b840 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1b850 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d      iAbortFlag =
1b860 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1b870 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70  .      iAMem = p
1b880 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
1b890 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
1b8a0 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
1b8b0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42  >nExpr;.      iB
1b8c0 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
1b8d0 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
1b8e0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
1b8f0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
1b900 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b910 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1b920 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46  eger, 0, iAbortF
1b930 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
1b940 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65  Comment((v, "cle
1b950 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ar abort flag"))
1b960 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1b970 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b980 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65  Integer, 0, iUse
1b990 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
1b9a0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
1b9b0 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74  dicate accumulat
1b9c0 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20  or empty"));.   
1b9d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b9e0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1b9f0 20 30 2c 20 61 64 64 72 49 6e 69 74 69 61 6c 69   0, addrInitiali
1ba00 7a 65 4c 6f 6f 70 29 3b 0a 0a 20 20 20 20 20 20  zeLoop);..      
1ba10 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1ba20 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
1ba30 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72  tputs a single r
1ba40 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
1ba50 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20  .      ** set.  
1ba60 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  This subroutine 
1ba70 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74  first looks at t
1ba80 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66  he iUseFlag.  If
1ba90 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20   iUseFlag.      
1baa0 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ** is less than 
1bab0 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
1bac0 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
1bad0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
1bae0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
1baf0 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66  ocessing calls f
1bb00 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  or the query to 
1bb10 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72  abort, this subr
1bb20 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
1bb30 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69  increments the i
1bb40 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79  AbortFlag memory
1bb50 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65   location before
1bb60 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20   returning in.  
1bb70 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20      ** order to 
1bb80 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65  signal the calle
1bb90 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20  r to abort..    
1bba0 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53    */.      addrS
1bbb0 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65  etAbort = sqlite
1bbc0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1bbd0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
1bbe0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1bbf0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
1bc00 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
1bc10 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1bc20 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61  , "set abort fla
1bc30 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
1bc40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1bc50 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30   OP_Return, 0, 0
1bc60 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  );.      addrOut
1bc70 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
1bc80 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1bc90 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
1bca0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1bcb0 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61  P_IfPos, iUseFla
1bcc0 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
1bcd0 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +2);.      VdbeC
1bce0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75  omment((v, "Grou
1bcf0 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
1bd00 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74  ator entry point
1bd10 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
1bd20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1bd30 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29  OP_Return, 0, 0)
1bd40 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
1bd50 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
1bd60 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
1bd70 0a 20 20 20 20 20 20 69 66 28 20 70 48 61 76 69  .      if( pHavi
1bd80 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ng ){.        sq
1bd90 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1bda0 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
1bdb0 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
1bdc0 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  1, SQLITE_JUMPIF
1bdd0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NULL);.      }. 
1bde0 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
1bdf0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
1be00 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p->pEList, 0, 0,
1be10 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   pOrderBy,.     
1be20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be30 20 64 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74   distinct, pDest
1be40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1be50 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70          addrOutp
1be60 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74  utRow+1, addrSet
1be70 41 62 6f 72 74 2c 20 61 66 66 29 3b 0a 20 20 20  Abort, aff);.   
1be80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1be90 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp2(v, OP_Retur
1bea0 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
1beb0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1bec0 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73  "end groupby res
1bed0 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29  ult generator"))
1bee0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
1bef0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1bf00 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65  e that will rese
1bf10 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61  t the group-by a
1bf20 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20  ccumulator.     
1bf30 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 52 65   */.      addrRe
1bf40 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  set = sqlite3Vdb
1bf50 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1bf60 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75  .      resetAccu
1bf70 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
1bf80 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
1bf90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bfa0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op2(v, OP_Return
1bfb0 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20  , 0, 0);..      
1bfc0 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20  /* Begin a loop 
1bfd0 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
1bfe0 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77  t all source row
1bff0 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  s in GROUP BY or
1c000 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  der..      ** Th
1c010 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65  is might involve
1c020 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f   two separate lo
1c030 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53  ops with an OP_S
1c040 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20  ort in between, 
1c050 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d  or.      ** it m
1c060 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65  ight be a single
1c070 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20   loop that uses 
1c080 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72  an index to extr
1c090 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  act information.
1c0a0 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
1c0b0 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62  right order to b
1c0c0 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20  egin with..     
1c0d0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1c0e0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1c0f0 6c 28 76 2c 20 61 64 64 72 49 6e 69 74 69 61 6c  l(v, addrInitial
1c100 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  izeLoop);.      
1c110 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c120 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  2(v, OP_Gosub, 0
1c130 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
1c140 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
1c150 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
1c160 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
1c170 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75 70   pWhere, &pGroup
1c180 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  By, 0);.      if
1c190 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
1c1a0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
1c1b0 20 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42       if( pGroupB
1c1c0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
1c1d0 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
1c1e0 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
1c1f0 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
1c200 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
1c210 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
1c220 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
1c230 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68    The OP_OpenEph
1c240 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c  emeral table wil
1c250 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
1c260 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
1c270 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
1c280 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
1c290 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
1c2a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 47 72    */.        pGr
1c2b0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
1c2c0 70 42 79 3b 0a 20 20 20 20 20 20 20 20 67 72 6f  pBy;.        gro
1c2d0 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
1c2e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c2f0 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
1c300 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
1c310 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
1c320 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
1c330 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
1c340 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
1c350 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
1c360 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
1c370 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
1c380 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
1c390 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
1c3a0 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
1c3b0 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
1c3c0 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
1c3d0 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
1c3e0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
1c3f0 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
1c400 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20  int regRecord;. 
1c410 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b         int nCol;
1c420 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72  .        int nGr
1c430 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20  oupBy;..        
1c440 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b  groupBySort = 1;
1c450 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42  .        nGroupB
1c460 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y = pGroupBy->nE
1c470 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  xpr;.        nCo
1c480 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20 31  l = nGroupBy + 1
1c490 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
1c4a0 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20  roupBy+1;.      
1c4b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
1c4c0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
1c4d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
1c4e0 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  f( sAggInfo.aCol
1c4f0 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  [i].iSorterColum
1c500 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
1c510 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20      nCol++;.    
1c520 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
1c530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c540 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61   }.        regBa
1c550 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  se = sqlite3GetT
1c560 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1c570 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
1c580 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
1c590 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1c5a0 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73  pGroupBy, regBas
1c5b0 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
1c5c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c5d0 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41   OP_Sequence, sA
1c5e0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
1c5f0 78 2c 72 65 67 42 61 73 65 2b 6e 47 72 6f 75 70  x,regBase+nGroup
1c600 42 79 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  By);.        j =
1c610 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20   nGroupBy+1;.   
1c620 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1c630 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
1c640 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1c650 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
1c660 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41  _col *pCol = &sA
1c670 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a  ggInfo.aCol[i];.
1c680 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
1c690 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
1c6a0 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
1c6b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1c6c0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 76 2c 20  odeGetColumn(v, 
1c6d0 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c  pCol->pTab, pCol
1c6e0 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d  ->iColumn, pCol-
1c6f0 3e 69 54 61 62 6c 65 2c 0a 20 20 20 20 20 20 20  >iTable,.       
1c700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 20                j 
1c720 2b 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20  + regBase);.    
1c730 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
1c740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c750 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65   }.        regRe
1c760 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
1c770 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
1c780 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1c790 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1c7a0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
1c7b0 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67  gBase, nCol, reg
1c7c0 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
1c7d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c7e0 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
1c7f0 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
1c800 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f  tingIdx, regReco
1c810 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
1c820 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1c830 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
1c840 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
1c850 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1c860 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
1c870 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20  egBase, nCol);. 
1c880 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
1c890 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
1c8a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1c8b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1c8c0 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Sort, sAggInfo.s
1c8d0 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45  ortingIdx, addrE
1c8e0 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  nd);.        Vdb
1c8f0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52  eComment((v, "GR
1c900 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a  OUP BY sort"));.
1c910 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
1c920 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d  .useSortingIdx =
1c930 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   1;.      }..   
1c940 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
1c950 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
1c960 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74   BY terms and st
1c970 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62  ore in b0, b1, b
1c980 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62  2....      ** (b
1c990 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  0 is memory loca
1c9a0 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31  tion iBMem+0, b1
1c9b0 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64   is iBMem+1, and
1c9c0 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20   so forth).     
1c9d0 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65   ** Then compare
1c9e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
1c9f0 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69  UP BY terms agai
1ca00 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  nst the GROUP BY
1ca10 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20   terms.      ** 
1ca20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
1ca30 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20  s row currently 
1ca40 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31  stored in a0, a1
1ca50 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  , a2....      */
1ca60 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66  .      addrTopOf
1ca70 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
1ca80 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1ca90 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1caa0 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
1cab0 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
1cac0 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
1cad0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
1cae0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1caf0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
1cb00 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
1cb10 64 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b  dx, j, iBMem+j);
1cb20 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1cb30 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
1cb40 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  fo.directMode = 
1cb50 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  1;.          sql
1cb60 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1cb70 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
1cb80 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d  [j].pExpr, iBMem
1cb90 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +j);.        }. 
1cba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
1cbb0 28 6a 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  (j=pGroupBy->nEx
1cbc0 70 72 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  pr-1; j>=0; j--)
1cbd0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  {.        if( j=
1cbe0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1cbf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cc00 33 28 76 2c 20 4f 50 5f 45 71 2c 20 69 41 4d 65  3(v, OP_Eq, iAMe
1cc10 6d 2b 6a 2c 20 61 64 64 72 50 72 6f 63 65 73 73  m+j, addrProcess
1cc20 52 6f 77 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  Row, iBMem+j);. 
1cc30 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1cc40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1cc50 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1cc60 4e 65 2c 20 69 41 4d 65 6d 2b 6a 2c 20 61 64 64  Ne, iAMem+j, add
1cc70 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 2c 20  rGroupByChange, 
1cc80 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20  iBMem+j);.      
1cc90 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
1cca0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
1ccb0 76 2c 20 2d 31 2c 20 28 76 6f 69 64 2a 29 70 4b  v, -1, (void*)pK
1ccc0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d  eyInfo->aColl[j]
1ccd0 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
1cce0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1ccf0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
1cd00 4c 49 54 45 5f 4e 55 4c 4c 45 51 55 41 4c 29 3b  LITE_NULLEQUAL);
1cd10 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1cd20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1cd30 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65   that runs whene
1cd40 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59  ver the GROUP BY
1cd50 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20   changes..      
1cd60 2a 2a 20 43 68 61 6e 67 65 20 69 6e 20 74 68 65  ** Change in the
1cd70 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65   GROUP BY are de
1cd80 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72  tected by the pr
1cd90 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20  evious code.    
1cda0 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20    ** block.  If 
1cdb0 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68  there were no ch
1cdc0 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63  anges, this bloc
1cdd0 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20  k is skipped..  
1cde0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1cdf0 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73  This code copies
1ce00 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62   current group b
1ce10 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31  y terms in b0,b1
1ce20 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  ,b2,....      **
1ce30 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61   over to a0,a1,a
1ce40 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c  2.  It then call
1ce50 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62  s the output sub
1ce60 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
1ce70 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
1ce80 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
1ce90 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20  lator registers 
1cea0 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20  in preparation. 
1ceb0 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
1cec0 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61  next GROUP BY ba
1ced0 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tch..      */.  
1cee0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1cef0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
1cf00 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65  ddrGroupByChange
1cf10 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
1cf20 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; j<pGroupBy->nE
1cf30 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
1cf40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cf50 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c  dOp2(v, OP_Move,
1cf60 20 69 42 4d 65 6d 2b 6a 2c 20 69 41 4d 65 6d 2b   iBMem+j, iAMem+
1cf70 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j);.      }.    
1cf80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cf90 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1cfa0 20 30 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f   0, addrOutputRo
1cfb0 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
1cfc0 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
1cfd0 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20  t one row"));.  
1cfe0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cff0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
1d000 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61  s, iAbortFlag, a
1d010 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 56  ddrEnd);.      V
1d020 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1d030 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67  check abort flag
1d040 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
1d050 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d060 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64  OP_Gosub, 0, add
1d070 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56  rReset);.      V
1d080 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1d090 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f  reset accumulato
1d0a0 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
1d0b0 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65  Update the aggre
1d0c0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
1d0d0 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  s based on the c
1d0e0 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20  ontent of.      
1d0f0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ** the current r
1d100 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ow.      */.    
1d110 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1d120 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
1d130 72 50 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20 20  rProcessRow);.  
1d140 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
1d150 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
1d160 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
1d170 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d180 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1d190 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   1, iUseFlag);. 
1d1a0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1d1b0 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64  ((v, "indicate d
1d1c0 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74  ata in accumulat
1d1d0 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
1d1e0 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   End of the loop
1d1f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1d200 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
1d210 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1d220 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d230 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66  OP_Next, sAggInf
1d240 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
1d250 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20  drTopOfLoop);.  
1d260 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d270 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
1d280 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
1d290 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1d2a0 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
1d2b0 64 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20 31  ddrSortingIdx, 1
1d2c0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1d2d0 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
1d2e0 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73  final row of res
1d2f0 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ult.      */.   
1d300 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d310 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1d320 2c 20 30 2c 20 61 64 64 72 4f 75 74 70 75 74 52  , 0, addrOutputR
1d330 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
1d340 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
1d350 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b  ut final row"));
1d360 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a  .      .    } /*
1d370 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 20   endif pGroupBy 
1d380 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20  */.    else {.  
1d390 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d      ExprList *pM
1d3a0 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20  inMax = 0;.     
1d3b0 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20   ExprList *pDel 
1d3c0 3d 20 30 3b 0a 20 20 20 20 20 20 75 38 20 66 6c  = 0;.      u8 fl
1d3d0 61 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68  ag;..      /* Ch
1d3e0 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79  eck if the query
1d3f0 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68   is of one of th
1d400 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
1d410 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
1d420 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69    **   SELECT mi
1d430 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  n(x) FROM ....  
1d440 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
1d450 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a  max(x) FROM ....
1d460 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1d470 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e  * If it is, then
1d480 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e   ask the code in
1d490 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65   where.c to atte
1d4a0 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75  mpt to sort resu
1d4b0 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  lts.      ** as 
1d4c0 69 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20  if there was an 
1d4d0 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20  "ORDER ON x" or 
1d4e0 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43  "ORDER ON x DESC
1d4f0 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20  " clause. .     
1d500 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69   ** If where.c i
1d510 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63  s able to produc
1d520 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64  e results sorted
1d530 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20   in this order, 
1d540 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 64  then.      ** ad
1d550 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62  d vdbe code to b
1d560 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
1d570 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20  processing loop 
1d580 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20  after the .     
1d590 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61 74   ** first iterat
1d5a0 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66  ion (since the f
1d5b0 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
1d5c0 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20  f the loop is . 
1d5d0 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65       ** guarante
1d5e0 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ed to operate on
1d5f0 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74 68   the row with th
1d600 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78  e minimum or max
1d610 69 6d 75 6d 20 0a 20 20 20 20 20 20 2a 2a 20 76  imum .      ** v
1d620 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f  alue of x, the o
1d630 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65 64  nly row required
1d640 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  )..      **.    
1d650 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66    ** A special f
1d660 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73  lag must be pass
1d670 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
1d680 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69  reBegin() to sli
1d690 67 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20 6d  ghtly.      ** m
1d6a0 6f 64 69 66 79 20 62 65 68 61 76 69 6f 75 72 20  odify behaviour 
1d6b0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
1d6c0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
1d6d0 2b 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  + If the query i
1d6e0 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28  s a "SELECT min(
1d6f0 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  x)", then the lo
1d700 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20  op coded by.    
1d710 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63    **     where.c
1d720 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72   should not iter
1d730 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c  ate over any val
1d740 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  ues with a NULL 
1d750 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 20  value.      **  
1d760 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20     for x..      
1d770 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  **.      **   + 
1d780 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f  The optimizer co
1d790 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74  de in where.c (t
1d7a0 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64 65  he thing that de
1d7b0 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20 20  cides which.    
1d7c0 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f    **     index o
1d7d0 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65  r indices to use
1d7e0 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61  ) should place a
1d7f0 20 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72   different prior
1d800 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a  ity on .      **
1d810 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67 20       satisfying 
1d820 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20 63  the 'ORDER BY' c
1d830 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f  lause than it do
1d840 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65  es in other case
1d850 73 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  s..      **     
1d860 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e  Refer to code an
1d870 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68  d comments in wh
1d880 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c  ere.c for detail
1d890 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
1d8a0 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51    flag = minMaxQ
1d8b0 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 29 3b  uery(pParse, p);
1d8c0 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20  .      if( flag 
1d8d0 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 6c 20  ){.        pDel 
1d8e0 3d 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69  = pMinMax = sqli
1d8f0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
1d900 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  b, p->pEList->a[
1d910 30 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74 29  0].pExpr->pList)
1d920 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  ;.        if( pM
1d930 69 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61  inMax && !db->ma
1d940 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1d950 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d          pMinMax-
1d960 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
1d970 3d 20 28 28 66 6c 61 67 3d 3d 4f 52 44 45 52 42  = ((flag==ORDERB
1d980 59 5f 4d 49 4e 29 3f 30 3a 31 29 3b 0a 20 20 20  Y_MIN)?0:1);.   
1d990 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
1d9a0 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d  a[0].pExpr->op =
1d9b0 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
1d9c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
1d9d0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73       /* This cas
1d9e0 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67  e runs if the ag
1d9f0 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47  gregate has no G
1da00 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
1da10 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 72   The.      ** pr
1da20 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68  ocessing is much
1da30 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74   simpler since t
1da40 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
1da50 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20  ingle row.      
1da60 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20  ** of output..  
1da70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 73      */.      res
1da80 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
1da90 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
1daa0 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =
1dab0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1dac0 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
1dad0 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4d  ist, pWhere, &pM
1dae0 69 6e 4d 61 78 2c 20 66 6c 61 67 29 3b 0a 20 20  inMax, flag);.  
1daf0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
1db00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
1db10 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
1db20 74 65 28 70 44 65 6c 29 3b 0a 20 20 20 20 20 20  te(pDel);.      
1db30 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
1db40 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
1db50 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
1db60 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
1db70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Info);.      if(
1db80 20 21 70 4d 69 6e 4d 61 78 20 26 26 20 66 6c 61   !pMinMax && fla
1db90 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
1dba0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1dbb0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57  , OP_Goto, 0, pW
1dbc0 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 20  Info->iBreak);. 
1dbd0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
1dbe0 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20  nt((v, "%s() by 
1dbf0 69 6e 64 65 78 22 2c 20 28 66 6c 61 67 3d 3d 4f  index", (flag==O
1dc00 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22  RDERBY_MIN?"min"
1dc10 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20  :"max")));.     
1dc20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1dc30 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
1dc40 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
1dc50 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
1dc60 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
1dc70 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
1dc80 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
1dc90 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
1dca0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1dcb0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
1dcc0 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53  ving, addrEnd, S
1dcd0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1dce0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1dcf0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
1dd00 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
1dd10 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  EList, 0, 0, 0, 
1dd20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  -1, .           
1dd30 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
1dd40 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45  , addrEnd, addrE
1dd50 6e 64 2c 20 61 66 66 29 3b 0a 0a 20 20 20 20 20  nd, aff);..     
1dd60 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1dd70 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20  Delete(pDel);.  
1dd80 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1dd90 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1dda0 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  v, addrEnd);.   
1ddb0 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61   .  } /* endif a
1ddc0 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
1ddd0 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  /..  /* If there
1dde0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
1ddf0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20  clause, then we 
1de00 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65  need to sort the
1de10 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e   results.  ** an
1de20 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74  d send them to t
1de30 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20  he callback one 
1de40 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  by one..  */.  i
1de50 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
1de60 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
1de70 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76  ail(pParse, p, v
1de80 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
1de90 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 23 69   pDest);.  }..#i
1dea0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1deb0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 2f 2a 20  T_SUBQUERY.  /* 
1dec0 49 66 20 74 68 69 73 20 77 61 73 20 61 20 73 75  If this was a su
1ded0 62 71 75 65 72 79 2c 20 77 65 20 68 61 76 65 20  bquery, we have 
1dee0 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64 20 74 68  now converted th
1def0 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
1df00 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79  a.  ** temporary
1df10 20 74 61 62 6c 65 2e 20 20 53 6f 20 73 65 74 20   table.  So set 
1df20 74 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  the SrcList_item
1df30 2e 69 73 50 6f 70 75 6c 61 74 65 64 20 66 6c 61  .isPopulated fla
1df40 67 20 74 6f 20 70 72 65 76 65 6e 74 0a 20 20 2a  g to prevent.  *
1df50 2a 20 74 68 69 73 20 73 75 62 71 75 65 72 79 20  * this subquery 
1df60 66 72 6f 6d 20 62 65 69 6e 67 20 65 76 61 6c 75  from being evalu
1df70 61 74 65 64 20 61 67 61 69 6e 20 61 6e 64 20 74  ated again and t
1df80 6f 20 66 6f 72 63 65 20 74 68 65 20 75 73 65 20  o force the use 
1df90 6f 66 0a 20 20 2a 2a 20 74 68 65 20 74 65 6d 70  of.  ** the temp
1dfa0 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a  orary table..  *
1dfb0 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20  /.  if( pParent 
1dfc0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1dfd0 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53  Parent->pSrc->nS
1dfe0 72 63 3e 70 61 72 65 6e 74 54 61 62 20 29 3b 0a  rc>parentTab );.
1dff0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1e000 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72  ent->pSrc->a[par
1e010 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d  entTab].pSelect=
1e020 3d 70 20 29 3b 0a 20 20 20 20 70 50 61 72 65 6e  =p );.    pParen
1e030 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e  t->pSrc->a[paren
1e040 74 54 61 62 5d 2e 69 73 50 6f 70 75 6c 61 74 65  tTab].isPopulate
1e050 64 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 1;.  }.#endi
1e060 66 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  f..  /* Jump her
1e070 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71  e to skip this q
1e080 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
1e090 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1e0a0 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20  bel(v, iEnd);.. 
1e0b0 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77   /* The SELECT w
1e0c0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
1e0d0 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65  coded.   Set the
1e0e0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20   return code to 
1e0f0 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  0.  ** to indica
1e100 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20  te no errors..  
1e110 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20  */.  rc = 0;..  
1e120 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  /* Control jumps
1e130 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65   to here if an e
1e140 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
1e150 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70  red above, or up
1e160 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  on.  ** successf
1e170 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65  ul coding of the
1e180 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65   SELECT..  */.se
1e190 6c 65 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a 20  lect_end:..  /* 
1e1a0 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
1e1b0 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c  names if we will
1e1c0 20 62 65 20 75 73 69 6e 67 20 74 68 65 6d 20 69   be using them i
1e1d0 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54  n a callback.  T
1e1e0 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73  his.  ** step is
1e1f0 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
1e200 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20  output is going 
1e210 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 64 65  to some other de
1e220 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  stination..  */.
1e230 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e240 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44  _OK && pDest->eD
1e250 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
1e260 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  k ){.    generat
1e270 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
1e280 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
1e290 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73  EList);.  }..  s
1e2a0 71 6c 69 74 65 33 5f 66 72 65 65 28 73 41 67 67  qlite3_free(sAgg
1e2b0 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71  Info.aCol);.  sq
1e2c0 6c 69 74 65 33 5f 66 72 65 65 28 73 41 67 67 49  lite3_free(sAggI
1e2d0 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65  nfo.aFunc);.  re
1e2e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
1e2f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1e300 45 42 55 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a  EBUG)./*.*******
1e310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e350 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
1e360 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 69  following code i
1e370 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
1e380 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
1e390 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 64 65   only.  The code
1e3a0 0a 2a 2a 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  .** that follows
1e3b0 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72   does not appear
1e3c0 20 69 6e 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64   in normal build
1e3d0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  s..**.** These r
1e3e0 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
1e3f0 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 74 68   to print out th
1e400 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6c 6c  e content of all
1e410 20 6f 72 20 70 61 72 74 20 6f 66 20 61 20 0a 2a   or part of a .*
1e420 2a 20 70 61 72 73 65 20 73 74 72 75 63 74 75 72  * parse structur
1e430 65 73 20 73 75 63 68 20 61 73 20 53 65 6c 65 63  es such as Selec
1e440 74 20 6f 72 20 45 78 70 72 2e 20 20 53 75 63 68  t or Expr.  Such
1e450 20 70 72 69 6e 74 6f 75 74 73 20 61 72 65 20 75   printouts are u
1e460 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c  seful.** for hel
1e470 70 69 6e 67 20 74 6f 20 75 6e 64 65 72 73 74 61  ping to understa
1e480 6e 64 20 77 68 61 74 20 69 73 20 68 61 70 70 65  nd what is happe
1e490 6e 69 6e 67 20 69 6e 73 69 64 65 20 74 68 65 20  ning inside the 
1e4a0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a  code generator.*
1e4b0 2a 20 64 75 72 69 6e 67 20 74 68 65 20 65 78 65  * during the exe
1e4c0 63 75 74 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65  cution of comple
1e4d0 78 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  x SELECT stateme
1e4e0 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  nts..**.** These
1e4f0 20 72 6f 75 74 69 6e 65 20 61 72 65 20 6e 6f 74   routine are not
1e500 20 63 61 6c 6c 65 64 20 61 6e 79 77 68 65 72 65   called anywhere
1e510 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
1e520 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20   normal.** code 
1e530 62 61 73 65 2e 20 20 54 68 65 6e 20 61 72 65 20  base.  Then are 
1e540 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 63  intended to be c
1e550 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
1e560 6e 20 74 68 65 20 64 65 62 75 67 67 65 72 0a 2a  n the debugger.*
1e570 2a 20 6f 72 20 66 72 6f 6d 20 74 65 6d 70 6f 72  * or from tempor
1e580 61 72 79 20 22 70 72 69 6e 74 66 22 20 73 74 61  ary "printf" sta
1e590 74 65 6d 65 6e 74 73 20 69 6e 73 65 72 74 65 64  tements inserted
1e5a0 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a   for debugging..
1e5b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1e5c0 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
1e5d0 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
1e5e0 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 2d  p->token.z && p-
1e5f0 3e 74 6f 6b 65 6e 2e 6e 3e 30 20 29 7b 0a 20 20  >token.n>0 ){.  
1e600 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1e610 69 6e 74 66 28 22 28 25 2e 2a 73 22 2c 20 70 2d  intf("(%.*s", p-
1e620 3e 74 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e 74 6f 6b  >token.n, p->tok
1e630 65 6e 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  en.z);.  }else{.
1e640 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1e650 50 72 69 6e 74 66 28 22 28 25 64 22 2c 20 70 2d  Printf("(%d", p-
1e660 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >op);.  }.  if( 
1e670 70 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  p->pLeft ){.    
1e680 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1e690 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c  tf(" ");.    sql
1e6a0 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d  ite3PrintExpr(p-
1e6b0 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69  >pLeft);.  }.  i
1e6c0 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a  f( p->pRight ){.
1e6d0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1e6e0 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20  Printf(" ");.   
1e6f0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
1e700 72 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  r(p->pRight);.  
1e710 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
1e720 50 72 69 6e 74 66 28 22 29 22 29 3b 0a 7d 0a 73  Printf(")");.}.s
1e730 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
1e740 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28  e3PrintExprList(
1e750 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
1e760 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1e770 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1e780 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1e790 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
1e7a0 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
1e7b0 70 72 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 70  pr);.    if( i<p
1e7c0 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b  List->nExpr-1 ){
1e7d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
1e7e0 62 75 67 50 72 69 6e 74 66 28 22 2c 20 22 29 3b  bugPrintf(", ");
1e7f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
1e800 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
1e810 50 72 69 6e 74 53 65 6c 65 63 74 28 53 65 6c 65  PrintSelect(Sele
1e820 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64 65 6e  ct *p, int inden
1e830 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  t){.  sqlite3Deb
1e840 75 67 50 72 69 6e 74 66 28 22 25 2a 73 53 45 4c  ugPrintf("%*sSEL
1e850 45 43 54 28 25 70 29 20 22 2c 20 69 6e 64 65 6e  ECT(%p) ", inden
1e860 74 2c 20 22 22 2c 20 70 29 3b 0a 20 20 73 71 6c  t, "", p);.  sql
1e870 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
1e880 74 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  t(p->pEList);.  
1e890 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1e8a0 74 66 28 22 5c 6e 22 29 3b 0a 20 20 69 66 28 20  tf("\n");.  if( 
1e8b0 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 63  p->pSrc ){.    c
1e8c0 68 61 72 20 2a 7a 50 72 65 66 69 78 3b 0a 20 20  har *zPrefix;.  
1e8d0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 7a 50 72    int i;.    zPr
1e8e0 65 66 69 78 20 3d 20 22 46 52 4f 4d 22 3b 0a 20  efix = "FROM";. 
1e8f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
1e900 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  >pSrc->nSrc; i++
1e910 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1e920 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1e930 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e  tem = &p->pSrc->
1e940 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[i];.      sqli
1e950 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1e960 25 2a 73 20 22 2c 20 69 6e 64 65 6e 74 2b 36 2c  %*s ", indent+6,
1e970 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20   zPrefix);.     
1e980 20 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a 20   zPrefix = "";. 
1e990 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1e9a0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
1e9b0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1e9c0 72 69 6e 74 66 28 22 28 5c 6e 22 29 3b 0a 20 20  rintf("(\n");.  
1e9d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 69        sqlite3Pri
1e9e0 6e 74 53 65 6c 65 63 74 28 70 49 74 65 6d 2d 3e  ntSelect(pItem->
1e9f0 70 53 65 6c 65 63 74 2c 20 69 6e 64 65 6e 74 2b  pSelect, indent+
1ea00 31 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  10);.        sql
1ea10 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1ea20 22 25 2a 73 29 22 2c 20 69 6e 64 65 6e 74 2b 38  "%*s)", indent+8
1ea30 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , "");.      }el
1ea40 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e  se if( pItem->zN
1ea50 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
1ea60 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1ea70 66 28 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  f("%s", pItem->z
1ea80 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
1ea90 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1eaa0 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
1eab0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1eac0 74 66 28 22 28 74 61 62 6c 65 3a 20 25 73 29 22  tf("(table: %s)"
1ead0 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
1eae0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
1eaf0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1eb00 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
1eb10 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1eb20 69 6e 74 66 28 22 20 41 53 20 25 73 22 2c 20 70  intf(" AS %s", p
1eb30 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
1eb40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1eb50 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
1eb60 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  -1 ){.        sq
1eb70 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1eb80 28 22 2c 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (",");.      }. 
1eb90 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
1eba0 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
1ebb0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
1ebc0 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
1ebd0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1ebe0 74 66 28 22 25 2a 73 20 57 48 45 52 45 20 22 2c  tf("%*s WHERE ",
1ebf0 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
1ec00 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
1ec10 70 72 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  pr(p->pWhere);. 
1ec20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1ec30 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
1ec40 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70  .  if( p->pGroup
1ec50 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
1ec60 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
1ec70 73 20 47 52 4f 55 50 20 42 59 20 22 2c 20 69 6e  s GROUP BY ", in
1ec80 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
1ec90 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c  qlite3PrintExprL
1eca0 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 29  ist(p->pGroupBy)
1ecb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
1ecc0 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
1ecd0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61    }.  if( p->pHa
1ece0 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  ving ){.    sqli
1ecf0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1ed00 25 2a 73 20 48 41 56 49 4e 47 20 22 2c 20 69 6e  %*s HAVING ", in
1ed10 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
1ed20 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
1ed30 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  p->pHaving);.   
1ed40 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1ed50 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
1ed60 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
1ed70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1ed80 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
1ed90 4f 52 44 45 52 20 42 59 20 22 2c 20 69 6e 64 65  ORDER BY ", inde
1eda0 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c  nt, "");.    sql
1edb0 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
1edc0 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  t(p->pOrderBy);.
1edd0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1ede0 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
1edf0 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68  }.}./* End of th
1ee00 65 20 73 74 72 75 63 74 75 72 65 20 64 65 62 75  e structure debu
1ee10 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a  g printing code.
1ee20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ee30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ee40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ee50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ee60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23  *************/.#
1ee70 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
1ee80 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
1ee90 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1eea0 44 45 42 55 47 29 20 2a 2f 0a                    DEBUG) */.