/ Hex Artifact Content
Login

Artifact defdb8cdf7d2d8e1e0df117e50af6378fdaf1329:


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 36 35  select.c,v 1.465
0200: 20 32 30 30 38 2f 30 38 2f 31 34 20 30 30 3a 31   2008/08/14 00:1
0210: 39 3a 34 39 20 64 72 68 20 45 78 70 20 24 0a 2a  9:49 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 73  id clearSelect(s
02c0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
02d0: 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  ct *p){.  sqlite
02e0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
02f0: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  db, p->pEList);.
0300: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
0310: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53  Delete(db, p->pS
0320: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  rc);.  sqlite3Ex
0330: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
0340: 70 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  pWhere);.  sqlit
0350: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
0360: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
0370: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
0380: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0390: 61 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  aving);.  sqlite
03a0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
03b0: 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
03c0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
03d0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
03e0: 50 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65  Prior);.  sqlite
03f0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
0400: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 73 71  p->pLimit);.  sq
0410: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0420: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
0440: 6c 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73  lize a SelectDes
0450: 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  t structure..*/.
0460: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
0470: 63 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63  ctDestInit(Selec
0480: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e  tDest *pDest, in
0490: 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61  t eDest, int iPa
04a0: 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44  rm){.  pDest->eD
04b0: 65 73 74 20 3d 20 65 44 65 73 74 3b 0a 20 20 70  est = eDest;.  p
04c0: 44 65 73 74 2d 3e 69 50 61 72 6d 20 3d 20 69 50  Dest->iParm = iP
04d0: 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66  arm;.  pDest->af
04e0: 66 69 6e 69 74 79 20 3d 20 30 3b 0a 20 20 70 44  finity = 0;.  pD
04f0: 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 30 3b 0a 20  est->iMem = 0;. 
0500: 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 30   pDest->nMem = 0
0510: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
0520: 63 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63  cate a new Selec
0530: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0540: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0550: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75   to that.** stru
0560: 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74  cture..*/.Select
0570: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e   *sqlite3SelectN
0580: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
0590: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
05a0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
05b0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
05c0: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69  List,     /* whi
05d0: 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e  ch columns to in
05e0: 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73  clude in the res
05f0: 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ult */.  SrcList
0600: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f   *pSrc,        /
0610: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
0620: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
0630: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
0640: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
0650: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
0660: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
0670: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
0680: 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50  ,   /* the GROUP
0690: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
06a0: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20  Expr *pHaving,  
06b0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56        /* the HAV
06c0: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
06d0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
06e0: 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44  By,   /* the ORD
06f0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
0700: 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74    int isDistinct
0710: 2c 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65 20  ,       /* true 
0720: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
0730: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
0740: 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  nt */.  Expr *pL
0750: 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  imit,         /*
0760: 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e   LIMIT value.  N
0770: 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73  ULL means not us
0780: 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  ed */.  Expr *pO
0790: 66 66 73 65 74 20 20 20 20 20 20 20 20 20 2f 2a  ffset         /*
07a0: 20 4f 46 46 53 45 54 20 76 61 6c 75 65 2e 20 20   OFFSET value.  
07b0: 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66  NULL means no of
07c0: 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  fset */.){.  Sel
07d0: 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
07e0: 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73  ect standin;.  s
07f0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
0800: 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20  rse->db;.  pNew 
0810: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
0820: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
0830: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 61 73 73  (*pNew) );.  ass
0840: 65 72 74 28 20 21 70 4f 66 66 73 65 74 20 7c 7c  ert( !pOffset ||
0850: 20 70 4c 69 6d 69 74 20 29 3b 20 20 20 2f 2a 20   pLimit );   /* 
0860: 43 61 6e 27 74 20 68 61 76 65 20 4f 46 46 53 45  Can't have OFFSE
0870: 54 20 77 69 74 68 6f 75 74 20 4c 49 4d 49 54 2e  T without LIMIT.
0880: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   */.  if( pNew==
0890: 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  0 ){.    pNew = 
08a0: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65  &standin;.    me
08b0: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
08c0: 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
08d0: 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  }.  if( pEList==
08e0: 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20  0 ){.    pEList 
08f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
0900: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
0910: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
0920: 62 2c 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30 29 2c  b,TK_ALL,0,0,0),
0930: 20 30 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d   0);.  }.  pNew-
0940: 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74  >pEList = pEList
0950: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d  ;.  pNew->pSrc =
0960: 20 70 53 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70   pSrc;.  pNew->p
0970: 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
0980: 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
0990: 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 70   = pGroupBy;.  p
09a0: 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70  New->pHaving = p
09b0: 48 61 76 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e  Having;.  pNew->
09c0: 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
09d0: 72 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44  rBy;.  pNew->isD
09e0: 69 73 74 69 6e 63 74 20 3d 20 69 73 44 69 73 74  istinct = isDist
09f0: 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  inct;.  pNew->op
0a00: 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20   = TK_SELECT;.  
0a10: 61 73 73 65 72 74 28 20 70 4f 66 66 73 65 74 3d  assert( pOffset=
0a20: 3d 30 20 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20  =0 || pLimit!=0 
0a30: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  );.  pNew->pLimi
0a40: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e  t = pLimit;.  pN
0a50: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f  ew->pOffset = pO
0a60: 66 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 61  ffset;.  pNew->a
0a70: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
0a80: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
0a90: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d  rOpenEphm[1] = -
0aa0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  1;.  pNew->addrO
0ab0: 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b  penEphm[2] = -1;
0ac0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 26 73 74  .  if( pNew==&st
0ad0: 61 6e 64 69 6e 29 20 7b 0a 20 20 20 20 63 6c 65  andin) {.    cle
0ae0: 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70 4e 65  arSelect(db, pNe
0af0: 77 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  w);.    pNew = 0
0b00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
0b10: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  New;.}../*.** De
0b20: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
0b30: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0b40: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
0b50: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
0b60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
0b70: 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ectDelete(sqlite
0b80: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
0b90: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
0ba0: 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62    clearSelect(db
0bb0: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
0bc0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
0bd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76    }.}../*.** Giv
0be0: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
0bf0: 66 69 65 72 73 20 70 72 65 63 65 65 64 69 6e 67  fiers preceeding
0c00: 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72   the JOIN keywor
0c10: 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  d, determine the
0c20: 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e  .** type of join
0c30: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
0c40: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  eger constant th
0c50: 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61  at expresses tha
0c60: 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72  t type.** in ter
0c70: 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ms of the follow
0c80: 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a  ing bit values:.
0c90: 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e  **.**     JT_INN
0ca0: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f  ER.**     JT_CRO
0cb0: 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54  SS.**     JT_OUT
0cc0: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54  ER.**     JT_NAT
0cd0: 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c  URAL.**     JT_L
0ce0: 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49  EFT.**     JT_RI
0cf0: 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c  GHT.**.** A full
0d00: 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74   outer join is t
0d10: 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  he combination o
0d20: 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54  f JT_LEFT and JT
0d30: 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  _RIGHT..**.** If
0d40: 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75   an illegal or u
0d50: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
0d60: 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68  type is seen, th
0d70: 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a  en still return.
0d80: 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20  ** a join type, 
0d90: 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72  but put an error
0da0: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
0db0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
0dc0: 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65   sqlite3JoinType
0dd0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0de0: 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e  Token *pA, Token
0df0: 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29   *pB, Token *pC)
0e00: 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65  {.  int jointype
0e10: 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61   = 0;.  Token *a
0e20: 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e  pAll[3];.  Token
0e30: 20 2a 70 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   *p;.  static co
0e40: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
0e50: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79   const char zKey
0e60: 77 6f 72 64 5b 38 5d 3b 0a 20 20 20 20 75 38 20  word[8];.    u8 
0e70: 6e 43 68 61 72 3b 0a 20 20 20 20 75 38 20 63 6f  nChar;.    u8 co
0e80: 64 65 3b 0a 20 20 7d 20 6b 65 79 77 6f 72 64 73  de;.  } keywords
0e90: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 61  [] = {.    { "na
0ea0: 74 75 72 61 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41  tural", 7, JT_NA
0eb0: 54 55 52 41 4c 20 7d 2c 0a 20 20 20 20 7b 20 22  TURAL },.    { "
0ec0: 6c 65 66 74 22 2c 20 20 20 20 34 2c 20 4a 54 5f  left",    4, JT_
0ed0: 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  LEFT|JT_OUTER },
0ee0: 0a 20 20 20 20 7b 20 22 72 69 67 68 74 22 2c 20  .    { "right", 
0ef0: 20 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54    5, JT_RIGHT|JT
0f00: 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20  _OUTER },.    { 
0f10: 22 66 75 6c 6c 22 2c 20 20 20 20 34 2c 20 4a 54  "full",    4, JT
0f20: 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a  _LEFT|JT_RIGHT|J
0f30: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b  T_OUTER },.    {
0f40: 20 22 6f 75 74 65 72 22 2c 20 20 20 35 2c 20 4a   "outer",   5, J
0f50: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b  T_OUTER },.    {
0f60: 20 22 69 6e 6e 65 72 22 2c 20 20 20 35 2c 20 4a   "inner",   5, J
0f70: 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 20 20 7b  T_INNER },.    {
0f80: 20 22 63 72 6f 73 73 22 2c 20 20 20 35 2c 20 4a   "cross",   5, J
0f90: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53  T_INNER|JT_CROSS
0fa0: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
0fb0: 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20  , j;.  apAll[0] 
0fc0: 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d  = pA;.  apAll[1]
0fd0: 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32   = pB;.  apAll[2
0fe0: 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d  ] = pC;.  for(i=
0ff0: 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b  0; i<3 && apAll[
1000: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  i]; i++){.    p 
1010: 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20  = apAll[i];.    
1020: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f  for(j=0; j<sizeo
1030: 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65  f(keywords)/size
1040: 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b  of(keywords[0]);
1050: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1060: 20 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b   p->n==keywords[
1070: 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20  j].nChar .      
1080: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
1090: 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d  rNICmp((char*)p-
10a0: 3e 7a 2c 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e  >z, keywords[j].
10b0: 7a 4b 65 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d  zKeyword, p->n)=
10c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f  =0 ){.        jo
10d0: 69 6e 74 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72  intype |= keywor
10e0: 64 73 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20  ds[j].code;.    
10f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1100: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1110: 20 6a 3e 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f   j>=sizeof(keywo
1120: 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77  rds)/sizeof(keyw
1130: 6f 72 64 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ords[0]) ){.    
1140: 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54    jointype |= JT
1150: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72  _ERROR;.      br
1160: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
1170: 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74   if(.     (joint
1180: 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c  ype & (JT_INNER|
1190: 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f  JT_OUTER))==(JT_
11a0: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20  INNER|JT_OUTER) 
11b0: 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70  ||.     (jointyp
11c0: 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30  e & JT_ERROR)!=0
11d0: 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  .  ){.    const 
11e0: 63 68 61 72 20 2a 7a 53 70 20 3d 20 22 20 22 3b  char *zSp = " ";
11f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 21  .    assert( pB!
1200: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  =0 );.    if( pC
1210: 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a  ==0 ){ zSp++; }.
1220: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1230: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b  Msg(pParse, "unk
1240: 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72  nown or unsuppor
1250: 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22  ted join type: "
1260: 0a 20 20 20 20 20 20 20 22 25 54 20 25 54 25 73  .       "%T %T%s
1270: 25 54 22 2c 20 70 41 2c 20 70 42 2c 20 7a 53 70  %T", pA, pB, zSp
1280: 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  , pC);.    joint
1290: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
12a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69 6e    }else if( join
12b0: 74 79 70 65 20 26 20 4a 54 5f 52 49 47 48 54 20  type & JT_RIGHT 
12c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
12d0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
12e0: 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e 64        "RIGHT and
12f0: 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e   FULL OUTER JOIN
1300: 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e  s are not curren
1310: 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b  tly supported");
1320: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
1330: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20  JT_INNER;.  }.  
1340: 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b  return jointype;
1350: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1360: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
1370: 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c  column in a tabl
1380: 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  e.  Return -1 if
1390: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   the column.** i
13a0: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
13b0: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  in the table..*/
13c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75  .static int colu
13d0: 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70  mnIndex(Table *p
13e0: 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Tab, const char 
13f0: 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  *zCol){.  int i;
1400: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
1410: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
1420: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1430: 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f  trICmp(pTab->aCo
1440: 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  l[i].zName, zCol
1450: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
1460: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
1470: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1480: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 74 6f  he value of a to
1490: 6b 65 6e 20 74 6f 20 61 20 27 5c 30 30 30 27 2d  ken to a '\000'-
14a0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
14b0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
14c0: 64 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b 65 6e  d setToken(Token
14d0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
14e0: 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 28 75  *z){.  p->z = (u
14f0: 38 2a 29 7a 3b 0a 20 20 70 2d 3e 6e 20 3d 20 7a  8*)z;.  p->n = z
1500: 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20 30   ? strlen(z) : 0
1510: 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a  ;.  p->dyn = 0;.
1520: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1530: 20 74 6f 6b 65 6e 20 74 6f 20 74 68 65 20 64 6f   token to the do
1540: 75 62 6c 65 2d 71 75 6f 74 65 64 20 61 6e 64 20  uble-quoted and 
1550: 65 73 63 61 70 65 64 20 76 65 72 73 69 6f 6e 20  escaped version 
1560: 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 70 6f  of the string po
1570: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a  inted.** to by z
1580: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3b 0a 2a  . For example;.*
1590: 2a 0a 2a 2a 20 20 20 20 7b 61 22 62 63 7d 20 20  *.**    {a"bc}  
15a0: 2d 3e 20 20 7b 22 61 22 22 62 63 22 7d 0a 2a 2f  ->  {"a""bc"}.*/
15b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
15c0: 51 75 6f 74 65 64 54 6f 6b 65 6e 28 50 61 72 73  QuotedToken(Pars
15d0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
15e0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
15f0: 2a 7a 29 7b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  *z){..  /* Check
1600: 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 20 63   if the string c
1610: 6f 6e 74 61 69 6e 73 20 61 6e 79 20 22 20 63 68  ontains any " ch
1620: 61 72 61 63 74 65 72 73 2e 20 49 66 20 69 74 20  aracters. If it 
1630: 64 6f 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  does, then.  ** 
1640: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
1650: 6c 6c 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20  ll malloc space 
1660: 74 6f 20 63 72 65 61 74 65 20 61 20 71 75 6f 74  to create a quot
1670: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 0a 20 20  ed version of.  
1680: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 6e  ** the string in
1690: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 61 76  . Otherwise, sav
16a0: 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  e a call to sqli
16b0: 74 65 33 4d 50 72 69 6e 74 66 28 29 20 62 79 0a  te3MPrintf() by.
16c0: 20 20 2a 2a 20 6a 75 73 74 20 63 6f 70 79 69 6e    ** just copyin
16d0: 67 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f  g the pointer to
16e0: 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 20 20 2a   the string..  *
16f0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1700: 7a 32 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28  z2 = z;.  while(
1710: 20 2a 7a 32 20 29 7b 0a 20 20 20 20 69 66 28 20   *z2 ){.    if( 
1720: 2a 7a 32 3d 3d 27 22 27 20 29 20 62 72 65 61 6b  *z2=='"' ) break
1730: 3b 0a 20 20 20 20 7a 32 2b 2b 3b 0a 20 20 7d 0a  ;.    z2++;.  }.
1740: 0a 20 20 69 66 28 20 2a 7a 32 20 29 7b 0a 20 20  .  if( *z2 ){.  
1750: 20 20 2f 2a 20 53 74 72 69 6e 67 20 63 6f 6e 74    /* String cont
1760: 61 69 6e 73 20 22 20 63 68 61 72 61 63 74 65 72  ains " character
1770: 73 20 2d 20 63 6f 70 79 20 61 6e 64 20 71 75 6f  s - copy and quo
1780: 74 65 20 74 68 65 20 73 74 72 69 6e 67 2e 20 2a  te the string. *
1790: 2f 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 28 75 38  /.    p->z = (u8
17a0: 20 2a 29 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   *)sqlite3MPrint
17b0: 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 5c  f(pParse->db, "\
17c0: 22 25 77 5c 22 22 2c 20 7a 29 3b 0a 20 20 20 20  "%w\"", z);.    
17d0: 69 66 28 20 70 2d 3e 7a 20 29 7b 0a 20 20 20 20  if( p->z ){.    
17e0: 20 20 70 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28    p->n = strlen(
17f0: 28 63 68 61 72 20 2a 29 70 2d 3e 7a 29 3b 0a 20  (char *)p->z);. 
1800: 20 20 20 20 20 70 2d 3e 64 79 6e 20 3d 20 31 3b       p->dyn = 1;
1810: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1820: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 63 6f      /* String co
1830: 6e 74 61 69 6e 73 20 6e 6f 20 22 20 63 68 61 72  ntains no " char
1840: 61 63 74 65 72 73 20 2d 20 63 6f 70 79 20 74 68  acters - copy th
1850: 65 20 70 6f 69 6e 74 65 72 2e 20 2a 2f 0a 20 20  e pointer. */.  
1860: 20 20 70 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a 3b    p->z = (u8*)z;
1870: 0a 20 20 20 20 70 2d 3e 6e 20 3d 20 28 7a 32 20  .    p->n = (z2 
1880: 2d 20 7a 29 3b 0a 20 20 20 20 70 2d 3e 64 79 6e  - z);.    p->dyn
1890: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
18a0: 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 65 78 70  ** Create an exp
18b0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72  ression node for
18c0: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 77   an identifier w
18d0: 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ith the name of 
18e0: 7a 4e 61 6d 65 0a 2a 2f 0a 45 78 70 72 20 2a 73  zName.*/.Expr *s
18f0: 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78  qlite3CreateIdEx
1900: 70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pr(Parse *pParse
1910: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
1920: 61 6d 65 29 7b 0a 20 20 54 6f 6b 65 6e 20 64 75  ame){.  Token du
1930: 6d 6d 79 3b 0a 20 20 73 65 74 54 6f 6b 65 6e 28  mmy;.  setToken(
1940: 26 64 75 6d 6d 79 2c 20 7a 4e 61 6d 65 29 3b 0a  &dummy, zName);.
1950: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1960: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
1970: 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d  _ID, 0, 0, &dumm
1980: 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  y);.}../*.** Add
1990: 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 57   a term to the W
19a0: 48 45 52 45 20 65 78 70 72 65 73 73 69 6f 6e 20  HERE expression 
19b0: 69 6e 20 2a 70 70 45 78 70 72 20 74 68 61 74 20  in *ppExpr that 
19c0: 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a 2a 20  requires the.** 
19d0: 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74 6f 20 62  zCol column to b
19e0: 65 20 65 71 75 61 6c 20 69 6e 20 74 68 65 20 74  e equal in the t
19f0: 77 6f 20 74 61 62 6c 65 73 20 70 54 61 62 31 20  wo tables pTab1 
1a00: 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f 0a 73 74  and pTab2..*/.st
1a10: 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65  atic void addWhe
1a20: 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20  reTerm(.  Parse 
1a30: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1a40: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1a50: 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ntext */.  const
1a60: 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20   char *zCol,    
1a70: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1a80: 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  he column */.  c
1a90: 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62  onst Table *pTab
1aa0: 31 2c 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  1,      /* First
1ab0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73   table */.  cons
1ac0: 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73 31 2c  t char *zAlias1,
1ad0: 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f       /* Alias fo
1ae0: 72 20 66 69 72 73 74 20 74 61 62 6c 65 2e 20 20  r first table.  
1af0: 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
1b00: 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54   const Table *pT
1b10: 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53 65 63  ab2,      /* Sec
1b20: 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63  ond table */.  c
1b30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61  onst char *zAlia
1b40: 73 32 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73  s2,     /* Alias
1b50: 20 66 6f 72 20 73 65 63 6f 6e 64 20 74 61 62 6c   for second tabl
1b60: 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
1b70: 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 4a  */.  int iRightJ
1b80: 6f 69 6e 54 61 62 6c 65 2c 20 20 20 20 20 2f 2a  oinTable,     /*
1b90: 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
1ba0: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
1bb0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
1bc0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  xpr,           /
1bd0: 2a 20 41 64 64 20 74 68 65 20 65 71 75 61 6c 69  * Add the equali
1be0: 74 79 20 74 65 72 6d 20 74 6f 20 74 68 69 73 20  ty term to this 
1bf0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1c00: 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20  int isOuterJoin 
1c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1c20: 20 69 66 20 64 65 61 6c 69 6e 67 20 77 69 74 68   if dealing with
1c30: 20 61 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a   an OUTER join *
1c40: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 31  /.){.  Expr *pE1
1c50: 61 2c 20 2a 70 45 31 62 2c 20 2a 70 45 31 63 3b  a, *pE1b, *pE1c;
1c60: 0a 20 20 45 78 70 72 20 2a 70 45 32 61 2c 20 2a  .  Expr *pE2a, *
1c70: 70 45 32 62 2c 20 2a 70 45 32 63 3b 0a 20 20 45  pE2b, *pE2c;.  E
1c80: 78 70 72 20 2a 70 45 3b 0a 0a 20 20 70 45 31 61  xpr *pE;..  pE1a
1c90: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
1ca0: 49 64 45 78 70 72 28 70 50 61 72 73 65 2c 20 7a  IdExpr(pParse, z
1cb0: 43 6f 6c 29 3b 0a 20 20 70 45 32 61 20 3d 20 73  Col);.  pE2a = s
1cc0: 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78  qlite3CreateIdEx
1cd0: 70 72 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 29  pr(pParse, zCol)
1ce0: 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 31 3d  ;.  if( zAlias1=
1cf0: 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73  =0 ){.    zAlias
1d00: 31 20 3d 20 70 54 61 62 31 2d 3e 7a 4e 61 6d 65  1 = pTab1->zName
1d10: 3b 0a 20 20 7d 0a 20 20 70 45 31 62 20 3d 20 73  ;.  }.  pE1b = s
1d20: 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78  qlite3CreateIdEx
1d30: 70 72 28 70 50 61 72 73 65 2c 20 7a 41 6c 69 61  pr(pParse, zAlia
1d40: 73 31 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61  s1);.  if( zAlia
1d50: 73 32 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c  s2==0 ){.    zAl
1d60: 69 61 73 32 20 3d 20 70 54 61 62 32 2d 3e 7a 4e  ias2 = pTab2->zN
1d70: 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45 32 62 20  ame;.  }.  pE2b 
1d80: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49  = sqlite3CreateI
1d90: 64 45 78 70 72 28 70 50 61 72 73 65 2c 20 7a 41  dExpr(pParse, zA
1da0: 6c 69 61 73 32 29 3b 0a 20 20 70 45 31 63 20 3d  lias2);.  pE1c =
1db0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
1dc0: 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 45  arse, TK_DOT, pE
1dd0: 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20 20  1b, pE1a, 0);.  
1de0: 70 45 32 63 20 3d 20 73 71 6c 69 74 65 33 50 45  pE2c = sqlite3PE
1df0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
1e00: 4f 54 2c 20 70 45 32 62 2c 20 70 45 32 61 2c 20  OT, pE2b, pE2a, 
1e10: 30 29 3b 0a 20 20 70 45 20 3d 20 73 71 6c 69 74  0);.  pE = sqlit
1e20: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
1e30: 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45 32  TK_EQ, pE1c, pE2
1e40: 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45 20  c, 0);.  if( pE 
1e50: 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29  && isOuterJoin )
1e60: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
1e70: 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f  perty(pE, EP_Fro
1e80: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 45 2d 3e  mJoin);.    pE->
1e90: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1ea0: 3d 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  = iRightJoinTabl
1eb0: 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 45 78 70 72  e;.  }.  *ppExpr
1ec0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
1ed0: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 2a 70 70  d(pParse->db,*pp
1ee0: 45 78 70 72 2c 20 70 45 29 3b 0a 7d 0a 0a 2f 2a  Expr, pE);.}../*
1ef0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46  .** Set the EP_F
1f00: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
1f10: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66   on all terms of
1f20: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
1f30: 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65  ssion..** And se
1f40: 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68  t the Expr.iRigh
1f50: 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54  tJoinTable to iT
1f60: 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74  able for every t
1f70: 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78  erm in the.** ex
1f80: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
1f90: 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  The EP_FromJoin 
1fa0: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
1fb0: 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20   on terms of an 
1fc0: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65  expression to te
1fd0: 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f  ll.** the LEFT O
1fe0: 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73  UTER JOIN proces
1ff0: 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20  sing logic that 
2000: 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72  this term is par
2010: 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e  t of the.** join
2020: 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65   restriction spe
2030: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e  cified in the ON
2040: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2050: 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a   and not a part.
2060: 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67  ** of the more g
2070: 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61  eneral WHERE cla
2080: 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d  use.  These term
2090: 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72  s are moved over
20a0: 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   to the.** WHERE
20b0: 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a   clause during j
20c0: 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62  oin processing b
20d0: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  ut we need to re
20e0: 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79  member that they
20f0: 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69  .** originated i
2100: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
2110: 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  G clause..**.** 
2120: 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  The Expr.iRightJ
2130: 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74  oinTable tells t
2140: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2150: 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20  processing that 
2160: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
2170: 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62  n depends on tab
2180: 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  le iRightJoinTab
2190: 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  le even if that 
21a0: 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20  table is not.** 
21b0: 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69  explicitly menti
21c0: 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72  oned in the expr
21d0: 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e  ession.  That in
21e0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65  formation is nee
21f0: 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73  ded.** for cases
2200: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
2210: 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
2220: 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
2230: 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20  t2 ON t1.a=t2.b 
2240: 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a  AND t1.x=5.**.**
2250: 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73   The where claus
2260: 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72  e needs to defer
2270: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
2280: 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74   the t1.x=5.** t
2290: 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20  erm until after 
22a0: 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74  the t2 loop of t
22b0: 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61  he join.  In tha
22c0: 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c  t way, a.** NULL
22d0: 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20   t2 row will be 
22e0: 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65  inserted wheneve
22f0: 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77  r t1.x!=5.  If w
2300: 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65  e do not.** defe
2310: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
2320: 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c  f t1.x=5, it wil
2330: 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69  l be processed i
2340: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66  mmediately.** af
2350: 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ter the t1 loop 
2360: 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31  and rows with t1
2370: 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72  .x!=5 will never
2380: 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68   appear in.** th
2390: 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20  e output, which 
23a0: 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f  is incorrect..*/
23b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
23c0: 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70  JoinExpr(Expr *p
23d0: 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20  , int iTable){. 
23e0: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
23f0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
2400: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
2410: 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a  ;.    p->iRightJ
2420: 6f 69 6e 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  oinTable = iTabl
2430: 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78  e;.    setJoinEx
2440: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
2450: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
2460: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
2470: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2480: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
2490: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
24a0: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
24b0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
24c0: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
24d0: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
24e0: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
24f0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
2500: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
2510: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
2520: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
2530: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
2540: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66  .** The terms of
2550: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61   a FROM clause a
2560: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
2570: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20  the Select.pSrc 
2580: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
2590: 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c  e left most tabl
25a0: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65  e is the first e
25b0: 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70  ntry in Select.p
25c0: 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d  Src.  The right-
25d0: 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73  most.** table is
25e0: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e   the last entry.
25f0: 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61    The join opera
2600: 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74  tor is held in t
2610: 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  he entry to.** t
2620: 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65  he left.  Thus e
2630: 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20  ntry 0 contains 
2640: 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
2650: 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62  r for the join b
2660: 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65  etween.** entrie
2670: 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20  s 0 and 1.  Any 
2680: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2690: 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ses associated w
26a0: 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65  ith the join are
26b0: 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65  .** also attache
26c0: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e  d to the left en
26d0: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
26e0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
26f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
2700: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
2710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2720: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
2730: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
2740: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
2750: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2770: 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  * All tables in 
2780: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2790: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
27c0: 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  nters */.  struc
27d0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
27e0: 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65  pLeft;     /* Le
27f0: 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ft table being j
2800: 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  oined */.  struc
2810: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2820: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69  pRight;    /* Ri
2830: 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ght table being 
2840: 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  joined */..  pSr
2850: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  c = p->pSrc;.  p
2860: 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Left = &pSrc->a[
2870: 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26  0];.  pRight = &
2880: 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28  pLeft[1];.  for(
2890: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
28a0: 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74  c-1; i++, pRight
28b0: 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20  ++, pLeft++){.  
28c0: 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61    Table *pLeftTa
28d0: 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b  b = pLeft->pTab;
28e0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67  .    Table *pRig
28f0: 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e  htTab = pRight->
2900: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73  pTab;.    int is
2910: 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Outer;..    if( 
2920: 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70  pLeftTab==0 || p
2930: 52 69 67 68 74 54 61 62 3d 3d 30 20 29 20 63 6f  RightTab==0 ) co
2940: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75  ntinue;.    isOu
2950: 74 65 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 6a  ter = (pRight->j
2960: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
2970: 45 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20  ER)!=0;..    /* 
2980: 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c  When the NATURAL
2990: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
29a0: 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20 63  ent, add WHERE c
29b0: 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a  lause terms for.
29c0: 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c      ** every col
29d0: 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f  umn that the two
29e0: 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20   tables have in 
29f0: 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  common..    */. 
2a00: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6a     if( pRight->j
2a10: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
2a20: 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66  URAL ){.      if
2a30: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c  ( pRight->pOn ||
2a40: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
2a50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2a60: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2a70: 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f  e, "a NATURAL jo
2a80: 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  in may not have 
2a90: 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e  ".           "an
2aa0: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2ab0: 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  use", 0);.      
2ac0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2ad0: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
2ae0: 30 3b 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e  0; j<pLeftTab->n
2af0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
2b00: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
2b10: 20 70 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b   pLeftTab->aCol[
2b20: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
2b30: 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65    if( columnInde
2b40: 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61  x(pRightTab, zNa
2b50: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
2b60: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
2b70: 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20  (pParse, zName, 
2b80: 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d  pLeftTab, pLeft-
2b90: 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20  >zAlias, .      
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 54 61          pRightTa
2bc0: 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61  b, pRight->zAlia
2bd0: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf0: 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72   pRight->iCursor
2c00: 2c 20 26 70 2d 3e 70 57 68 65 72 65 2c 20 69 73  , &p->pWhere, is
2c10: 4f 75 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Outer);.        
2c20: 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20    .        }.   
2c30: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2c40: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68  /* Disallow both
2c50: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
2c60: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
2c70: 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20  e join.    */.  
2c80: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
2c90: 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73  n && pRight->pUs
2ca0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
2cb0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2cc0: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76  rse, "cannot hav
2cd0: 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  e both ON and US
2ce0: 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63  ING ".        "c
2cf0: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
2d00: 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20  me join");.     
2d10: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2d20: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
2d30: 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68   ON clause to th
2d40: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
2d50: 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65  RE clause, conne
2d60: 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61  cted by.    ** a
2d70: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
2d80: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2d90: 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20  Right->pOn ){.  
2da0: 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20      if( isOuter 
2db0: 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52  ) setJoinExpr(pR
2dc0: 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68  ight->pOn, pRigh
2dd0: 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  t->iCursor);.   
2de0: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
2df0: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
2e00: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68  arse->db, p->pWh
2e10: 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e  ere, pRight->pOn
2e20: 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d  );.      pRight-
2e30: 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  >pOn = 0;.    }.
2e40: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65  .    /* Create e
2e50: 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
2e60: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
2e70: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e  or each column n
2e80: 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74  amed.    ** in t
2e90: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  he USING clause.
2ea0: 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68    Example: If th
2eb0: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20  e two tables to 
2ec0: 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20  be joined are . 
2ed0: 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e     ** A and B an
2ee0: 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  d the USING clau
2ef0: 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61  se names X, Y, a
2f00: 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74  nd Z, then add t
2f10: 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  his.    ** to th
2f20: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20  e WHERE clause: 
2f30: 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41     A.X=B.X AND A
2f40: 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42  .Y=B.Y AND A.Z=B
2f50: 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74  .Z.    ** Report
2f60: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
2f70: 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65   column mentione
2f80: 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  d in the USING c
2f90: 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20  lause is.    ** 
2fa0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
2fb0: 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20   both tables to 
2fc0: 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a  be joined..    *
2fd0: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
2fe0: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
2ff0: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20    IdList *pList 
3000: 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  = pRight->pUsing
3010: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
3020: 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a   j<pList->nId; j
3030: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
3040: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74  r *zName = pList
3050: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
3060: 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e        if( column
3070: 49 6e 64 65 78 28 70 4c 65 66 74 54 61 62 2c 20  Index(pLeftTab, 
3080: 7a 4e 61 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c 75  zName)<0 || colu
3090: 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54 61  mnIndex(pRightTa
30a0: 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a 20  b, zName)<0 ){. 
30b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
30d0: 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73   "cannot join us
30e0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20  ing column %s - 
30f0: 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20  column ".       
3100: 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e       "not presen
3110: 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  t in both tables
3120: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
3130: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
3140: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3150: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50   addWhereTerm(pP
3160: 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c 65  arse, zName, pLe
3170: 66 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41  ftTab, pLeft->zA
3180: 6c 69 61 73 2c 20 0a 20 20 20 20 20 20 20 20 20  lias, .         
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a0: 20 20 20 70 52 69 67 68 74 54 61 62 2c 20 70 52     pRightTab, pR
31b0: 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20  ight->zAlias,.  
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
31e0: 2d 3e 69 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70  ->iCursor, &p->p
31f0: 57 68 65 72 65 2c 20 69 73 4f 75 74 65 72 29 3b  Where, isOuter);
3200: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3210: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
3220: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63  ../*.** Insert c
3230: 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61  ode into "v" tha
3240: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
3250: 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f  record on the to
3260: 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63  p of the.** stac
3270: 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  k into the sorte
3280: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
3290: 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  d pushOntoSorter
32a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
32b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
32c0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
32d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
32e0: 65 72 42 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  erBy,    /* The 
32f0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
3300: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
3310: 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  lect,       /* T
3320: 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20  he whole SELECT 
3330: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
3340: 6e 74 20 72 65 67 44 61 74 61 20 20 20 20 20 20  nt regData      
3350: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
3360: 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 74  r holding data t
3370: 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 29  o be sorted */.)
3380: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
3390: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
33a0: 6e 74 20 6e 45 78 70 72 20 3d 20 70 4f 72 64 65  nt nExpr = pOrde
33b0: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e  rBy->nExpr;.  in
33c0: 74 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69  t regBase = sqli
33d0: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
33e0: 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 32 29  pParse, nExpr+2)
33f0: 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  ;.  int regRecor
3400: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
3410: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
3420: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
3430: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
3440: 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61   pOrderBy, regBa
3450: 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  se, 0);.  sqlite
3460: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3470: 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64  P_Sequence, pOrd
3480: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
3490: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a  regBase+nExpr);.
34a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
34b0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
34c0: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
34d0: 45 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71  Expr+1, 1);.  sq
34e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
34f0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
3500: 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72  , regBase, nExpr
3510: 20 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64 29   + 2, regRecord)
3520: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3530: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
3540: 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79 2d  nsert, pOrderBy-
3550: 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65  >iECursor, regRe
3560: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
3570: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
3580: 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
3590: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
35a0: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
35b0: 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45  rse, regBase, nE
35c0: 78 70 72 2b 32 29 3b 0a 20 20 69 66 28 20 70 53  xpr+2);.  if( pS
35d0: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b  elect->iLimit ){
35e0: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20  .    int addr1, 
35f0: 61 64 64 72 32 3b 0a 20 20 20 20 69 6e 74 20 69  addr2;.    int i
3600: 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20 70  Limit;.    if( p
3610: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 20  Select->iOffset 
3620: 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20  ){.      iLimit 
3630: 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  = pSelect->iOffs
3640: 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  et+1;.    }else{
3650: 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20  .      iLimit = 
3660: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b  pSelect->iLimit;
3670: 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 31  .    }.    addr1
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 5a 65 72  dOp1(v, OP_IfZer
36a0: 6f 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  o, iLimit);.    
36b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36c0: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
36d0: 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20  iLimit, -1);.   
36e0: 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
36f0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
3700: 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69  _Goto);.    sqli
3710: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
3720: 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73  v, addr1);.    s
3730: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
3740: 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72  (v, OP_Last, pOr
3750: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29  derBy->iECursor)
3760: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3770: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65  eAddOp1(v, OP_De
3780: 6c 65 74 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  lete, pOrderBy->
3790: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  iECursor);.    s
37a0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
37b0: 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20  re(v, addr2);.  
37c0: 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69    pSelect->iLimi
37d0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t = 0;.  }.}../*
37e0: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20  .** Add code to 
37f0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46  implement the OF
3800: 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76  FSET.*/.static v
3810: 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a  oid codeOffset(.
3820: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
3830: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
3840: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
3850: 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  M */.  Select *p
3860: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
3870: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3880: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
3890: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20    int iContinue 
38a0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
38b0: 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72   to skip the cur
38c0: 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29  rent record */.)
38d0: 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73  {.  if( p->iOffs
38e0: 65 74 20 26 26 20 69 43 6f 6e 74 69 6e 75 65 21  et && iContinue!
38f0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  =0 ){.    int ad
3900: 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  dr;.    sqlite3V
3910: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3920: 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66 73  AddImm, p->iOffs
3930: 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64  et, -1);.    add
3940: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
3950: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 65  ddOp1(v, OP_IfNe
3960: 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a  g, p->iOffset);.
3970: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3980: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
3990: 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , 0, iContinue);
39a0: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
39b0: 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45  ((v, "skip OFFSE
39c0: 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20  T records"));.  
39d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
39e0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
39f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
3a00: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
3a10: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  check to make su
3a20: 72 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65  re the N registe
3a30: 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69  rs starting at i
3a40: 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69  Mem.** form a di
3a50: 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69  stinct entry.  i
3a60: 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67  Tab is a sorting
3a70: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
3a80: 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
3a90: 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  seen combination
3aa0: 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65  s of the N value
3ab0: 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  s.  A new entry 
3ac0: 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a  is made in iTab.
3ad0: 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ** if the curren
3ae0: 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e  t N values are n
3af0: 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70  ew..**.** A jump
3b00: 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69   to addrRepeat i
3b10: 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e  s made and the N
3b20: 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f  +1 values are po
3b30: 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  pped from the.**
3b40: 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f   stack if the to
3b50: 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65  p N elements are
3b60: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a   not distinct..*
3b70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
3b80: 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61  deDistinct(.  Pa
3b90: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3ba0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
3bb0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
3bc0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
3bd0: 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20   iTab,          
3be0: 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64  /* A sorting ind
3bf0: 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  ex used to test 
3c00: 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73  for distinctness
3c10: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65   */.  int addrRe
3c20: 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70  peat,    /* Jump
3c30: 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20   to here if not 
3c40: 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e  distinct */.  in
3c50: 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t N,            
3c60: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
3c70: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ements */.  int 
3c80: 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f  iMem           /
3c90: 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20  * First element 
3ca0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  */.){.  Vdbe *v;
3cb0: 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20  .  int r1;..  v 
3cc0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
3cd0: 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  .  r1 = sqlite3G
3ce0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
3cf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3d00: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
3d10: 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e  eRecord, iMem, N
3d20: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
3d30: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
3d40: 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64  _Found, iTab, ad
3d50: 64 72 52 65 70 65 61 74 2c 20 72 31 29 3b 0a 20  drRepeat, r1);. 
3d60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3d70: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
3d80: 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20  rt, iTab, r1);. 
3d90: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
3da0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
3db0: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  1);.}../*.** Gen
3dc0: 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d  erate an error m
3dd0: 65 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45  essage when a SE
3de0: 4c 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74  LECT is used wit
3df0: 68 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73  hin a subexpress
3e00: 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a  ion.** (example:
3e10: 20 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20    "a IN (SELECT 
3e20: 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20  * FROM table)") 
3e30: 62 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20  but it has more 
3e40: 74 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a  than 1 result.**
3e50: 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20   column.  We do 
3e60: 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75  this in a subrou
3e70: 74 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65  tine because the
3e80: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
3e90: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 70 6c 61   multiple.** pla
3ea0: 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ces..*/.static i
3eb0: 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69  nt checkForMulti
3ec0: 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f  ColumnSelectErro
3ed0: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
3ee0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
3ef0: 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20  se context. */. 
3f00: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
3f10: 73 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  st,   /* Destina
3f20: 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72  tion of SELECT r
3f30: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
3f40: 6e 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  nExpr           
3f50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
3f60: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74  sult columns ret
3f70: 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20  urned by SELECT 
3f80: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73  */.){.  int eDes
3f90: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
3fa0: 3b 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20  ;.  if( nExpr>1 
3fb0: 26 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d  && (eDest==SRT_M
3fc0: 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
3fd0: 5f 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  _Set) ){.    sql
3fe0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3ff0: 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e  rse, "only a sin
4000: 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77  gle result allow
4010: 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20  ed for ".       
4020: 22 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  "a SELECT that i
4030: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
4040: 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72  ression");.    r
4050: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65  eturn 1;.  }else
4060: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
4070: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
4080: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
4090: 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
40a0: 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74   the inside of t
40b0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
40c0: 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a   of a SELECT..**
40d0: 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e  .** If srcTab an
40e0: 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f  d nColumn are bo
40f0: 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  th zero, then th
4100: 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73  e pEList express
4110: 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c  ions.** are eval
4120: 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uated in order t
4130: 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66  o get the data f
4140: 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66  or this row.  If
4150: 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68   nColumn>0.** th
4160: 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65  en data is pulle
4170: 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e  d from srcTab an
4180: 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64  d pEList is used
4190: 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65   only to get the
41a0: 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f  .** datatypes fo
41b0: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a  r each column..*
41c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
41d0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
41e0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
41f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4200: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
4210: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
4220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4230: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
4240: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
4250: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78  ng coded */.  Ex
4260: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
4270: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
4280: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78   values being ex
4290: 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74  tracted */.  int
42a0: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
42b0: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
42c0: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
42d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
42e0: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
42f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
4300: 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  mns in the sourc
4310: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  e table */.  Exp
4320: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
4330: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
4340: 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74  ULL, sort result
4350: 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79  s using this key
4360: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
4370: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct,           /*
4380: 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75   If >=0, make su
4390: 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  re results are d
43a0: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 53 65 6c  istinct */.  Sel
43b0: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
43c0: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
43d0: 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
43e0: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
43f0: 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20  Continue,       
4400: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
4410: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
4420: 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69   next row */.  i
4430: 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20  nt iBreak       
4440: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
4450: 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ere to break out
4460: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
4470: 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  op */.){.  Vdbe 
4480: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
4490: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  be;.  int i;.  i
44a0: 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20  nt hasDistinct; 
44b0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
44c0: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
44d0: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
44e0: 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  t */.  int regRe
44f0: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
4500: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d     /* Start of m
4510: 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65  emory holding re
4520: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e  sult set */.  in
4530: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
4540: 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77  >eDest;   /* How
4550: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72   to dispose of r
4560: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
4570: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
4580: 50 61 72 6d 3b 20 20 20 2f 2a 20 46 69 72 73 74  Parm;   /* First
4590: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73   argument to dis
45a0: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
45b0: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c    int nResultCol
45c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
45d0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
45e0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20  t columns */..  
45f0: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
4600: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  n;.  assert( pEL
4610: 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44  ist!=0 );.  hasD
4620: 69 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69 6e  istinct = distin
4630: 63 74 3e 3d 30 3b 0a 20 20 69 66 28 20 70 4f 72  ct>=0;.  if( pOr
4640: 64 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61 73  derBy==0 && !has
4650: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
4660: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
4670: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d   iContinue);.  }
4680: 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20  ..  /* Pull the 
4690: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e  requested column
46a0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43  s..  */.  if( nC
46b0: 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 6e  olumn>0 ){.    n
46c0: 52 65 73 75 6c 74 43 6f 6c 20 3d 20 6e 43 6f 6c  ResultCol = nCol
46d0: 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  umn;.  }else{.  
46e0: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70    nResultCol = p
46f0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
4700: 7d 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69  }.  if( pDest->i
4710: 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  Mem==0 ){.    pD
4720: 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72  est->iMem = pPar
4730: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
4740: 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 6e 52  pDest->nMem = nR
4750: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 70 50  esultCol;.    pP
4760: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
4770: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73  esultCol;.  }els
4780: 65 20 69 66 28 20 70 44 65 73 74 2d 3e 6e 4d 65  e if( pDest->nMe
4790: 6d 21 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 7b  m!=nResultCol ){
47a0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
47b0: 70 65 6e 73 20 77 68 65 6e 20 74 77 6f 20 53 45  pens when two SE
47c0: 4c 45 43 54 73 20 6f 66 20 61 20 63 6f 6d 70 6f  LECTs of a compo
47d0: 75 6e 64 20 53 45 4c 45 43 54 20 68 61 76 65 20  und SELECT have 
47e0: 64 69 66 66 65 72 69 6e 67 0a 20 20 20 20 2a 2a  differing.    **
47f0: 20 6e 75 6d 62 65 72 73 20 6f 66 20 72 65 73 75   numbers of resu
4800: 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 20 54 68 65  lt columns.  The
4810: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
4820: 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
4830: 20 62 79 0a 20 20 20 20 2a 2a 20 61 20 68 69 67   by.    ** a hig
4840: 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her-level routin
4850: 65 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  e. */.    return
4860: 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 73 75 6c  ;.  }.  regResul
4870: 74 20 3d 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3b  t = pDest->iMem;
4880: 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30  .  if( nColumn>0
4890: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
48a0: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
48b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
48c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
48d0: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
48e0: 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b  i, regResult+i);
48f0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
4900: 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78  f( eDest!=SRT_Ex
4910: 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ists ){.    /* I
4920: 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
4930: 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e  n is an EXISTS(.
4940: 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ..) expression, 
4950: 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a  the actual.    *
4960: 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65  * values returne
4970: 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
4980: 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64  are not required
4990: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
49a0: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
49b0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c  List(pParse, pEL
49c0: 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ist, regResult, 
49d0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
49e0: 61 63 6b 29 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c  ack);.  }.  nCol
49f0: 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  umn = nResultCol
4a00: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  ;..  /* If the D
4a10: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
4a20: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
4a30: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
4a40: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
4a50: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
4a60: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
4a70: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
4a80: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
4a90: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
4aa0: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73   */.  if( hasDis
4ab0: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
4ac0: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
4ad0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
4ae0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f  List->nExpr==nCo
4af0: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65  lumn );.    code
4b00: 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
4b10: 20 64 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e 74   distinct, iCont
4b20: 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72  inue, nColumn, r
4b30: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 69  egResult);.    i
4b40: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
4b50: 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73  {.      codeOffs
4b60: 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  et(v, p, iContin
4b70: 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ue);.    }.  }..
4b80: 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75    if( checkForMu
4b90: 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
4ba0: 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65  rror(pParse, pDe
4bb0: 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  st, pEList->nExp
4bc0: 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
4bd0: 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
4be0: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a   eDest ){.    /*
4bf0: 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77   In this mode, w
4c00: 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20  rite each query 
4c10: 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65  result to the ke
4c20: 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  y of the tempora
4c30: 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  ry.    ** table 
4c40: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69  iParm..    */.#i
4c50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4c60: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
4c70: 54 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55  T.    case SRT_U
4c80: 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  nion: {.      in
4c90: 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d  t r1;.      r1 =
4ca0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
4cb0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
4cc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4cd0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
4ce0: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
4cf0: 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20   nColumn, r1);. 
4d00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4d10: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
4d20: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
4d30: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
4d40: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
4d50: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
4d60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4d70: 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  .    /* Construc
4d80: 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  t a record from 
4d90: 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  the query result
4da0: 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66  , but instead of
4db0: 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74  .    ** saving t
4dc0: 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20  hat record, use 
4dd0: 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64  it as a key to d
4de0: 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66  elete elements f
4df0: 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  rom.    ** the t
4e00: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
4e10: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Parm..    */.   
4e20: 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74   case SRT_Except
4e30: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4e40: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4e50: 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61  P_IdxDelete, iPa
4e60: 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rm, regResult, n
4e70: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62  Column);.      b
4e80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
4e90: 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65  if..    /* Store
4ea0: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
4eb0: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
4ec0: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
4ed0: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
4ee0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
4ef0: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
4f00: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
4f10: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
4f20: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
4f30: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4f40: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4f50: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
4f60: 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 69  mn, r1);.      i
4f70: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
4f80: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
4f90: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
4fa0: 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a  rderBy, p, r1);.
4fb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4fc0: 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
4fd0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
4fe0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
4ff0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5000: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
5010: 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20  d, iParm, r2);. 
5020: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5030: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
5040: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
5050: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
5060: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5070: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
5080: 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71  END);.        sq
5090: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
50a0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
50b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
50c0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
50d0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
50e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
50f0: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
5100: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
5110: 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
5120: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
5130: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
5140: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
5150: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
5160: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
5170: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
5180: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
5190: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
51a0: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
51b0: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
51c0: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
51d0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
51e0: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
51f0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
5200: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==1 );.      p->
5210: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
5220: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
5230: 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  y(pEList->a[0].p
5240: 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66  Expr, pDest->aff
5250: 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20 69 66  inity);.      if
5260: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
5270: 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73        /* At firs
5280: 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75  t glance you wou
5290: 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c  ld think we coul
52a0: 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74  d optimize out t
52b0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52  he.        ** OR
52c0: 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63  DER BY in this c
52d0: 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ase since the or
52e0: 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  der of entries i
52f0: 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20  n the set.      
5300: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61    ** does not ma
5310: 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65  tter.  But there
5320: 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49   might be a LIMI
5330: 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69  T clause, in whi
5340: 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ch.        ** ca
5350: 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65  se the order doe
5360: 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20  s matter */.    
5370: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
5380: 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
5390: 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  rBy, p, regResul
53a0: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
53b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20  .        int r1 
53c0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
53d0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
53e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
53f0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
5400: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
5410: 6c 74 2c 20 31 2c 20 72 31 2c 20 26 70 2d 3e 61  lt, 1, r1, &p->a
5420: 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
5430: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
5440: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
5450: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
5460: 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20  esult, 1);.     
5470: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5480: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
5490: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29  sert, iParm, r1)
54a0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
54b0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
54c0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
54d0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
54e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
54f0: 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74  If any row exist
5500: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
5510: 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20  et, record that 
5520: 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a  fact and abort..
5530: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
5540: 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20  SRT_Exists: {.  
5550: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5560: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
5570: 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a  ger, 1, iParm);.
5580: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
5590: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
55a0: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
55b0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
55c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
55d0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
55e0: 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
55f0: 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
5600: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
5610: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
5620: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
5630: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
5640: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
5650: 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
5660: 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
5670: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
5680: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
5690: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
56a0: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
56b0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
56c0: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
56d0: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
56e0: 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65   pOrderBy, p, re
56f0: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
5700: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5710: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
5720: 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ve(pParse, regRe
5730: 73 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b  sult, iParm, 1);
5740: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
5750: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
5760: 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
5770: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
5780: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5790: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
57a0: 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
57b0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
57c0: 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  RY */..    /* Se
57d0: 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  nd the data to t
57e0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  he callback func
57f0: 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75 62  tion or to a sub
5800: 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68 65  routine.  In the
5810: 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66 20  .    ** case of 
5820: 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74 68  a subroutine, th
5830: 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73  e subroutine its
5840: 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69 62  elf is responsib
5850: 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f  le for.    ** po
5860: 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 20 66  pping the data f
5870: 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20  rom the stack.. 
5880: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
5890: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 0a 20 20  RT_Coroutine:.  
58a0: 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62    case SRT_Callb
58b0: 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ack: {.      if(
58c0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
58d0: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
58e0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
58f0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
5900: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5910: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
5920: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
5930: 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  nColumn, r1);.  
5940: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
5950: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
5960: 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20  derBy, p, r1);. 
5970: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
5980: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
5990: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
59a0: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d  }else if( eDest=
59b0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
59c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
59d0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
59e0: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
59f0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  iParm);.      }e
5a00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5a10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5a20: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
5a30: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
5a40: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mn);.        sql
5a50: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
5a60: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
5a70: 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  se, regResult, n
5a80: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
5a90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5aa0: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
5ab0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
5ac0: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
5ad0: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
5ae0: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
5af0: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
5b00: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
5b10: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
5b20: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
5b30: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
5b40: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
5b50: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
5b60: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
5b70: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
5b80: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
5b90: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
5ba0: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
5bb0: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
5bc0: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
5bd0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
5be0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
5bf0: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
5c00: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5c10: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
5c20: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
5c30: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
5c40: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
5c50: 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f  is reached..  */
5c60: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
5c70: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
5c80: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 20 20  pOrderBy==0 );  
5c90: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
5ca0: 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20  n ORDER BY, the 
5cb0: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20  call to.        
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cd0: 20 20 20 20 2a 2a 20 70 75 73 68 4f 6e 74 6f 53      ** pushOntoS
5ce0: 6f 72 74 65 72 28 29 20 77 6f 75 6c 64 20 68 61  orter() would ha
5cf0: 76 65 20 63 6c 65 61 72 65 64 20 70 2d 3e 69 4c  ve cleared p->iL
5d00: 69 6d 69 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69  imit */.    sqli
5d10: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5d20: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69   OP_AddImm, p->i
5d30: 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20  Limit, -1);.    
5d40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5d50: 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  2(v, OP_IfZero, 
5d60: 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
5d70: 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  k);.  }.}../*.**
5d80: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
5d90: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
5da0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
5db0: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
5dc0: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
5dd0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
5de0: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
5df0: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
5e00: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
5e10: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
5e20: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
5e30: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
5e40: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
5e50: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
5e60: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
5e70: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
5e80: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
5e90: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
5ea0: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
5eb0: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
5ec0: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
5ed0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
5ee0: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
5ef0: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
5f00: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
5f10: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
5f20: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
5f30: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
5f40: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
5f50: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
5f60: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
5f70: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
5f80: 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20   is obtain from 
5f90: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
5fa0: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
5fb0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
5fc0: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
5fd0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
5fe0: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
5ff0: 66 72 65 65 64 2e 20 20 41 64 64 20 74 68 65 20  freed.  Add the 
6000: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
6010: 65 20 74 6f 20 74 68 65 20 50 34 20 66 69 65 6c  e to the P4 fiel
6020: 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75  d of an opcode u
6030: 73 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49 4e  sing.** P4_KEYIN
6040: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68  FO_HANDOFF is th
6050: 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64  e usual way of d
6060: 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73  ealing with this
6070: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
6080: 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d  nfo *keyInfoFrom
6090: 45 78 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a  ExprList(Parse *
60a0: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
60b0: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pList){.  sqli
60c0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
60d0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70  ->db;.  int nExp
60e0: 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49  r;.  KeyInfo *pI
60f0: 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78  nfo;.  struct Ex
6100: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
6110: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  em;.  int i;..  
6120: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
6130: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
6140: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
6150: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
6160: 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28  pInfo) + nExpr*(
6170: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
6180: 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  +1) );.  if( pIn
6190: 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  fo ){.    pInfo-
61a0: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
61b0: 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  8*)&pInfo->aColl
61c0: 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e  [nExpr];.    pIn
61d0: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78  fo->nField = nEx
61e0: 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65  pr;.    pInfo->e
61f0: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
6200: 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
6210: 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78  =pList->a; i<nEx
6220: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
6230: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
6240: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70   *pColl;.      p
6250: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
6260: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
6270: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
6280: 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
6290: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
62a0: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
62b0: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
62c0: 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69    pInfo->aColl[i
62d0: 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
62e0: 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64   pInfo->aSortOrd
62f0: 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73  er[i] = pItem->s
6300: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a  ortOrder;.    }.
6310: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e    }.  return pIn
6320: 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  fo;.}.../*.** If
6330: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
6340: 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73  was generated us
6350: 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70  ing a non-null p
6360: 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74  OrderBy argument
6370: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
6380: 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65  sults were place
6390: 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20  d in a sorter.  
63a0: 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69  After the loop i
63b0: 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  s terminated.** 
63c0: 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74  we need to run t
63d0: 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75  he sorter and ou
63e0: 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73  tput the results
63f0: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
6400: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
6410: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e  rates the code n
6420: 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74  eeded to do that
6430: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6440: 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
6450: 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  l(.  Parse *pPar
6460: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
6470: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
6480: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
6490: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
64a0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64  tatement */.  Vd
64b0: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
64c0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
64d0: 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20   into this VDBE 
64e0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
64f0: 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ,      /* Number
6500: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64   of columns of d
6510: 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ata */.  SelectD
6520: 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72  est *pDest /* Wr
6530: 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72  ite the sorted r
6540: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
6550: 7b 0a 20 20 69 6e 74 20 62 72 6b 20 3d 20 73 71  {.  int brk = sq
6560: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
6570: 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 63 6f 6e  el(v);.  int con
6580: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
6590: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69  akeLabel(v);.  i
65a0: 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69  nt addr;.  int i
65b0: 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64  Tab;.  int pseud
65c0: 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72  oTab = 0;.  Expr
65d0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
65e0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20   p->pOrderBy;.. 
65f0: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
6600: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74  st->eDest;.  int
6610: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
6620: 69 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20 72 65  iParm;..  int re
6630: 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52  gRow;.  int regR
6640: 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62 20 3d 20  owid;..  iTab = 
6650: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
6660: 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  or;.  if( eDest=
6670: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c  =SRT_Callback ||
6680: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
6690: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73 65  utine ){.    pse
66a0: 75 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65 2d  udoTab = pParse-
66b0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nTab++;.    sql
66c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
66d0: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
66e0: 6e 73 2c 20 30 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  ns, 0, nColumn);
66f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6700: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
6710: 6e 50 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54  nPseudo, pseudoT
6720: 61 62 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  ab, eDest==SRT_C
6730: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a 20 20  allback);.  }.  
6740: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
6750: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6760: 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 62  OP_Sort, iTab, b
6770: 72 6b 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  rk);.  codeOffse
6780: 74 28 76 2c 20 70 2c 20 63 6f 6e 74 29 3b 0a 20  t(v, p, cont);. 
6790: 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65   regRow = sqlite
67a0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
67b0: 73 65 29 3b 0a 20 20 72 65 67 52 6f 77 69 64 20  se);.  regRowid 
67c0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
67d0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
67e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
67f0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
6800: 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  Tab, pOrderBy->n
6810: 45 78 70 72 20 2b 20 31 2c 20 72 65 67 52 6f 77  Expr + 1, regRow
6820: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  );.  switch( eDe
6830: 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  st ){.    case S
6840: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
6850: 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
6860: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6870: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6880: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d  _NewRowid, iParm
6890: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
68a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
68b0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
68c0: 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  t, iParm, regRow
68d0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
68e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
68f0: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
6900: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
6910: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
6920: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6930: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
6940: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
6950: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
6960: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
6970: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6980: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
6990: 72 64 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72  rd, regRow, 1, r
69a0: 65 67 52 6f 77 69 64 2c 20 26 70 2d 3e 61 66 66  egRowid, &p->aff
69b0: 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20  inity, 1);.     
69c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
69d0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
69e0: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20  pParse, regRow, 
69f0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
6a00: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6a10: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
6a20: 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  rm, regRowid);. 
6a30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6a40: 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  }.    case SRT_M
6a50: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
6a60: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
6a70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
6a80: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
6a90: 73 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72  se, regRow, iPar
6aa0: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20  m, 1);.      /* 
6ab0: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
6ac0: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
6ad0: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
6ae0: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
6af0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
6b00: 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61   case SRT_Callba
6b10: 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ck:.    case SRT
6b20: 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20  _Coroutine: {.  
6b30: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
6b40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6b50: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
6b60: 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  , 1, regRowid);.
6b70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6b80: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
6b90: 73 65 72 74 2c 20 70 73 65 75 64 6f 54 61 62 2c  sert, pseudoTab,
6ba0: 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69   regRow, regRowi
6bb0: 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  d);.      for(i=
6bc0: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
6bd0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
6be0: 72 74 28 20 72 65 67 52 6f 77 21 3d 70 44 65 73  rt( regRow!=pDes
6bf0: 74 2d 3e 69 4d 65 6d 2b 69 20 29 3b 0a 20 20 20  t->iMem+i );.   
6c00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6c10: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
6c20: 75 6d 6e 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  umn, pseudoTab, 
6c30: 69 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69  i, pDest->iMem+i
6c40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6c50: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
6c60: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
6c70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6c80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
6c90: 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 4d  ltRow, pDest->iM
6ca0: 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  em, nColumn);.  
6cb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
6cc0: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
6cd0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65  ange(pParse, pDe
6ce0: 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d  st->iMem, nColum
6cf0: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
6d00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6d10: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
6d20: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
6d30: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
6d40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6d50: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
6d60: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
6d70: 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72  hing */.      br
6d80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
6d90: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
6da0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
6db0: 65 67 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65  egRow);.  sqlite
6dc0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
6dd0: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
6de0: 29 3b 0a 0a 20 20 2f 2a 20 4c 49 4d 49 54 20 68  );..  /* LIMIT h
6df0: 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e  as been implemen
6e00: 74 65 64 20 62 79 20 74 68 65 20 70 75 73 68 4f  ted by the pushO
6e10: 6e 74 6f 53 6f 72 74 65 72 28 29 20 72 6f 75 74  ntoSorter() rout
6e20: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ine..  */.  asse
6e30: 72 74 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30  rt( p->iLimit==0
6e40: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f   );..  /* The bo
6e50: 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ttom of the loop
6e60: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
6e70: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
6e80: 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69  v, cont);.  sqli
6e90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6ea0: 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
6eb0: 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  addr);.  sqlite3
6ec0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
6ed0: 28 76 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28 20  (v, brk);.  if( 
6ee0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
6ef0: 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  ack || eDest==SR
6f00: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
6f10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6f20: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
6f30: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b  , pseudoTab, 0);
6f40: 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  .  }..}../*.** R
6f50: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
6f60: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
6f70: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
6f80: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
6f90: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
6fa0: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
6fb0: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
6fc0: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
6fd0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
6fe0: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
6ff0: 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65  on type is the e
7000: 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65  xact datatype de
7010: 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74  finition extract
7020: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f  ed from the.** o
7030: 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54  riginal CREATE T
7040: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
7050: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
7060: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68   is a column. Th
7070: 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e  e.** declaration
7080: 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49   type for a ROWI
7090: 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47  D field is INTEG
70a0: 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e  ER. Exactly when
70b0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   an expression.*
70c0: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
70d0: 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  a column can be 
70e0: 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70  complex in the p
70f0: 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75  resence of subqu
7100: 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65  eries. The.** re
7110: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
7120: 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  ion in all of th
7130: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45  e following SELE
7140: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73  CT statements is
7150: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
7160: 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73  a column by this
7170: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
7180: 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52     SELECT col FR
7190: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
71a0: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
71b0: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
71c0: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
71d0: 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  l FROM tbl);.** 
71e0: 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f    SELECT abc FRO
71f0: 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53  M (SELECT col AS
7200: 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   abc FROM tbl);.
7210: 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  ** .** The decla
7220: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
7230: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  any expression o
7240: 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75  ther than a colu
7250: 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  mn is NULL..*/.s
7260: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
7270: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20   *columnType(.  
7280: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
7290: 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  , .  Expr *pExpr
72a0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
72b0: 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63  *pzOriginDb,.  c
72c0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
72d0: 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74  iginTab,.  const
72e0: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
72f0: 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  Col.){.  char co
7300: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
7310: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
7320: 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63  riginDb = 0;.  c
7330: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
7340: 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61  inTab = 0;.  cha
7350: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e  r const *zOrigin
7360: 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  Col = 0;.  int j
7370: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
7380: 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73   || pNC->pSrcLis
7390: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
73a0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
73b0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
73c0: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
73d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
73e0: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
73f0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
7400: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61  s a column. Loca
7410: 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65  te the table the
7420: 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67   column is being
7430: 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63  .      ** extrac
7440: 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65  ted from in Name
7450: 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74  Context.pSrcList
7460: 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79  . This table may
7470: 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a   be real.      *
7480: 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  * database table
7490: 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
74a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
74b0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
74c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
74d0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  ble structure co
74e0: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
74f0: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
7500: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20  Select *pS = 0; 
7510: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7520: 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e  elect the column
7530: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
7540: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  om */.      int 
7550: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
7560: 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78  olumn;  /* Index
7570: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54   of column in pT
7580: 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  ab */.      whil
7590: 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20  e( pNC && !pTab 
75a0: 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69  ){.        SrcLi
75b0: 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
75c0: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
75d0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c        for(j=0;j<
75e0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26  pTabList->nSrc &
75f0: 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  & pTabList->a[j]
7600: 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d  .iCursor!=pExpr-
7610: 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20  >iTable;j++);.  
7620: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62        if( j<pTab
7630: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20  List->nSrc ){.  
7640: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
7650: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
7660: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ab;.          pS
7670: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
7680: 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ].pSelect;.     
7690: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
76a0: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
76b0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
76c0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
76d0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
76e0: 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a        /* FIX ME:
76f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
7700: 20 63 61 6e 20 6f 63 63 75 72 73 20 69 66 20 79   can occurs if y
7710: 6f 75 20 68 61 76 65 20 73 6f 6d 65 74 68 69 6e  ou have somethin
7720: 67 20 6c 69 6b 65 20 22 53 45 4c 45 43 54 20 6e  g like "SELECT n
7730: 65 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a 20 20  ew.x;" inside.  
7740: 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67        ** a trigg
7750: 65 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  er.  In other wo
7760: 72 64 73 2c 20 69 66 20 79 6f 75 20 72 65 66 65  rds, if you refe
7770: 72 65 6e 63 65 20 74 68 65 20 73 70 65 63 69 61  rence the specia
7780: 6c 20 22 6e 65 77 22 0a 20 20 20 20 20 20 20 20  l "new".        
7790: 2a 2a 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ** table in the 
77a0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
77b0: 73 65 6c 65 63 74 2e 20 20 57 65 20 64 6f 20 6e  select.  We do n
77c0: 6f 74 20 68 61 76 65 20 61 20 67 6f 6f 64 20 77  ot have a good w
77d0: 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ay.        ** to
77e0: 20 66 69 6e 64 20 74 68 65 20 61 63 74 75 61 6c   find the actual
77f0: 20 74 61 62 6c 65 20 74 79 70 65 2c 20 73 6f 20   table type, so 
7800: 63 61 6c 6c 20 69 74 20 22 54 45 58 54 22 2e 20  call it "TEXT". 
7810: 20 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79 0a   This is really.
7820: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74          ** somet
7830: 68 69 6e 67 20 6f 66 20 61 20 62 75 67 2c 20 62  hing of a bug, b
7840: 75 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  ut I do not know
7850: 20 68 6f 77 20 74 6f 20 66 69 78 20 69 74 2e 0a   how to fix it..
7860: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
7870: 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
7880: 64 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75 63 65  does not produce
7890: 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
78a0: 77 65 72 20 2d 20 69 74 20 6a 75 73 74 20 70 72  wer - it just pr
78b0: 65 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a  events.        *
78c0: 2a 20 61 20 73 65 67 66 61 75 6c 74 2e 20 20 53  * a segfault.  S
78d0: 65 65 20 74 69 63 6b 65 74 20 23 31 32 32 39 2e  ee ticket #1229.
78e0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
78f0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58      zType = "TEX
7900: 54 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  T";.        brea
7910: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
7920: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20 29    assert( pTab )
7930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29  ;.      if( pS )
7940: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
7950: 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75   "table" is actu
7960: 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63  ally a sub-selec
7970: 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74  t or a view in t
7980: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
7990: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
79a0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
79b0: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
79c0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
79d0: 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20  nd origin.      
79e0: 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68    ** data for th
79f0: 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  e result-set col
7a00: 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73  umn of the sub-s
7a10: 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a  elect..        *
7a20: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  /.        if( iC
7a30: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53  ol>=0 && iCol<pS
7a40: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
7a50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
7a60: 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20  If iCol is less 
7a70: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
7a80: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
7a90: 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20  equests the.    
7aa0: 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f        ** rowid o
7ab0: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
7ac0: 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65   or view. This e
7ad0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67  xpression is leg
7ae0: 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20  al (see .       
7af0: 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20     ** test case 
7b00: 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20  misc2.2.2) - it 
7b10: 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73  always evaluates
7b20: 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20   to NULL..      
7b30: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
7b40: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
7b50: 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  ;.          Expr
7b60: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
7b70: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b  ->a[iCol].pExpr;
7b80: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
7b90: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
7ba0: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  rc;.          sN
7bb0: 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  C.pNext = 0;.   
7bc0: 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73         sNC.pPars
7bd0: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
7be0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
7bf0: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
7c00: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44  NC, p, &zOriginD
7c10: 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20  b, &zOriginTab, 
7c20: 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20  &zOriginCol); . 
7c30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7c40: 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 70  else if( pTab->p
7c50: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
7c60: 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c    /* A real tabl
7c70: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
7c80: 65 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20  ert( !pS );.    
7c90: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
7ca0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
7cb0: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Key;.        ass
7cc0: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
7cd0: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
7ce0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
7cf0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
7d00: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<0 ){.         
7d10: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
7d20: 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  R";.          zO
7d30: 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72 6f 77 69  riginCol = "rowi
7d40: 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d";.        }els
7d50: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e{.          zTy
7d60: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
7d70: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20  iCol].zType;.   
7d80: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f         zOriginCo
7d90: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
7da0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
7db0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f      }.        zO
7dc0: 72 69 67 69 6e 54 61 62 20 3d 20 70 54 61 62 2d  riginTab = pTab-
7dd0: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
7de0: 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20  if( pNC->pParse 
7df0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
7e00: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
7e10: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d  hemaToIndex(pNC-
7e20: 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  >pParse->db, pTa
7e30: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
7e40: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 44 62         zOriginDb
7e50: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e   = pNC->pParse->
7e60: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
7e70: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  me;.        }.  
7e80: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7e90: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
7ea0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
7eb0: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
7ec0: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
7ed0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
7ee0: 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c  ion is a sub-sel
7ef0: 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ect. Return the 
7f00: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
7f10: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72   and.      ** or
7f20: 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68  igin info for th
7f30: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
7f40: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
7f50: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  t of the SELECT.
7f60: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
7f70: 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
7f80: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
7f90: 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  NC;.      Select
7fa0: 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 70 53   *pS = pExpr->pS
7fb0: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70  elect;.      Exp
7fc0: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
7fd0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
7fe0: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
7ff0: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
8000: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
8010: 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  pNC;.      sNC.p
8020: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
8030: 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  rse;.      zType
8040: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
8050: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44  NC, p, &zOriginD
8060: 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20  b, &zOriginTab, 
8070: 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20  &zOriginCol); . 
8080: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8090: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a  }.#endif.  }.  .
80a0: 20 20 69 66 28 20 70 7a 4f 72 69 67 69 6e 44 62    if( pzOriginDb
80b0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
80c0: 70 7a 4f 72 69 67 69 6e 54 61 62 20 26 26 20 70  pzOriginTab && p
80d0: 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a 20 20  zOriginCol );.  
80e0: 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20 3d 20    *pzOriginDb = 
80f0: 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20 20 2a  zOriginDb;.    *
8100: 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 7a 4f  pzOriginTab = zO
8110: 72 69 67 69 6e 54 61 62 3b 0a 20 20 20 20 2a 70  riginTab;.    *p
8120: 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72  zOriginCol = zOr
8130: 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72  iginCol;.  }.  r
8140: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
8150: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
8160: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
8170: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
8180: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
8190: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
81a0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
81b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
81c0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
81d0: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
81e0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
81f0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
8200: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
8210: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
8220: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
8230: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
8240: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
8250: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
8260: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
8270: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8280: 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56  MIT_DECLTYPE.  V
8290: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
82a0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
82b0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
82c0: 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  NC;.  sNC.pSrcLi
82d0: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
82e0: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
82f0: 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  arse;.  for(i=0;
8300: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
8310: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
8320: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
8330: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f  i].pExpr;.    co
8340: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
8350: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8360: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
8370: 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20  ADATA.    const 
8380: 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20  char *zOrigDb = 
8390: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
83a0: 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  r *zOrigTab = 0;
83b0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
83c0: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20  *zOrigCol = 0;. 
83d0: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
83e0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
83f0: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
8400: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a  ab, &zOrigCol);.
8410: 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65  .    /* The vdbe
8420: 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f   must make its o
8430: 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  wn copy of the c
8440: 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f  olumn-type and o
8450: 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c  ther .    ** col
8460: 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74 72  umn specific str
8470: 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68  ings, in case th
8480: 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65  e schema is rese
8490: 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20  t before this.  
84a0: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63    ** virtual mac
84b0: 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e  hine is deleted.
84c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
84d0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
84e0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
84f0: 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44  DATABASE, zOrigD
8500: 62 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29  b, P4_TRANSIENT)
8510: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8520: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8530: 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c  , COLNAME_TABLE,
8540: 20 7a 4f 72 69 67 54 61 62 2c 20 50 34 5f 54 52   zOrigTab, P4_TR
8550: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
8560: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8570: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8580: 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43  E_COLUMN, zOrigC
8590: 6f 6c 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54  ol, P4_TRANSIENT
85a0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79  );.#else.    zTy
85b0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
85c0: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
85d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
85e0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
85f0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8600: 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70  E_DECLTYPE, zTyp
8610: 65 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29  e, P4_TRANSIENT)
8620: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
8630: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
8640: 54 59 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  TYPE */.}../*.**
8650: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
8660: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
8670: 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73  e VDBE the names
8680: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
8690: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
86a0: 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
86b0: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70  ion is used to p
86c0: 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a  rovide the.** az
86d0: 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20  Col[] values in 
86e0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  the callback..*/
86f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
8700: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
8710: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8720: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
8730: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
8740: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
8750: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
8760: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
8770: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
8780: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
8790: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
87a0: 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62   set */.){.  Vdb
87b0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
87c0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Vdbe;.  int i, j
87d0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
87e0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
87f0: 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73  int fullNames, s
8800: 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e  hortNames;..#ifn
8810: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8820: 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20  EXPLAIN.  /* If 
8830: 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41  this is an EXPLA
8840: 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74  IN, skip this st
8850: 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  ep */.  if( pPar
8860: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
8870: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
8880: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
8890: 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70   v!=0 );.  if( p
88a0: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
88b0: 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 64 62  et || v==0 || db
88c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
88d0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73   return;.  pPars
88e0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
88f0: 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20   1;.  fullNames 
8900: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
8910: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
8920: 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e  es)!=0;.  shortN
8930: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
8940: 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
8950: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
8960: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
8970: 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d  mCols(v, pEList-
8980: 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69  >nExpr);.  for(i
8990: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
89a0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
89b0: 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  xpr *p;.    p = 
89c0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
89d0: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  pr;.    if( p==0
89e0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
89f0: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
8a00: 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
8a10: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
8a20: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
8a30: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
8a40: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8a50: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
8a60: 45 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  E, zName, strlen
8a70: 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 65  (zName));.    }e
8a80: 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  lse if( p->op==T
8a90: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62  K_COLUMN && pTab
8aa0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61  List ){.      Ta
8ab0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
8ac0: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
8ad0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
8ae0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
8af0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c  for(j=0; j<pTabL
8b00: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
8b10: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
8b20: 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20  sor!=p->iTable; 
8b30: 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73  j++){}.      ass
8b40: 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d  ert( j<pTabList-
8b50: 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70  >nSrc );.      p
8b60: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
8b70: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
8b80: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
8b90: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
8ba0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8bb0: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
8bc0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
8bd0: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
8be0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
8bf0: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
8c00: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65  rowid";.      }e
8c10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
8c20: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
8c30: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
8c40: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73    }.      if( !s
8c50: 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75  hortNames && !fu
8c60: 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  llNames ){.     
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 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e   }else if( fullN
8cd0: 61 6d 65 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e  ames || (!shortN
8ce0: 61 6d 65 73 20 26 26 20 70 54 61 62 4c 69 73 74  ames && pTabList
8cf0: 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20  ->nSrc>1) ){.   
8d00: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
8d10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68   = 0;.        ch
8d20: 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20  ar *zTab;. .    
8d30: 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c      zTab = pTabL
8d40: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73  ist->a[j].zAlias
8d50: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 75  ;.        if( fu
8d60: 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d  llNames || zTab=
8d70: 3d 30 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62  =0 ) zTab = pTab
8d80: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
8d90: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
8da0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
8db0: 25 73 22 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c 29  %s", zTab, zCol)
8dc0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8dd0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8de0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8df0: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59  ME, zName, P4_DY
8e00: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65  NAMIC);.      }e
8e10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
8e20: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
8e30: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
8e40: 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 73 74 72  _NAME, zCol, str
8e50: 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20  len(zCol));.    
8e60: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
8e70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8e80: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
8e90: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28   COLNAME_NAME, (
8ea0: 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c  char*)p->span.z,
8eb0: 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20   p->span.n);.   
8ec0: 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74   }.  }.  generat
8ed0: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61  eColumnTypes(pPa
8ee0: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
8ef0: 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64  EList);.}..#ifnd
8f00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
8f10: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
8f20: 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  *.** Name of the
8f30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72   connection oper
8f40: 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65  ator, used for e
8f50: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
8f60: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
8f70: 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d  har *selectOpNam
8f80: 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61  e(int id){.  cha
8f90: 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20  r *z;.  switch( 
8fa0: 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  id ){.    case T
8fb0: 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d  K_ALL:       z =
8fc0: 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20   "UNION ALL";   
8fd0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8fe0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20  TK_INTERSECT: z 
8ff0: 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20  = "INTERSECT";  
9000: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9010: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a   TK_EXCEPT:    z
9020: 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20   = "EXCEPT";    
9030: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
9040: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
9050: 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20  z = "UNION";    
9060: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
9070: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64  return z;.}.#end
9080: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
9090: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
90a0: 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  T */../*.** Forw
90b0: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  ard declaration.
90c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
90d0: 65 70 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72  epSelectStmt(Par
90e0: 73 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 0a  se*, Select*);..
90f0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45  /*.** Given a SE
9100: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
9110: 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65  generate a Table
9120: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
9130: 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65  describes.** the
9140: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
9150: 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54  hat SELECT..*/.T
9160: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73  able *sqlite3Res
9170: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50  ultSetOfSelect(P
9180: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68  arse *pParse, ch
9190: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65  ar *zTabName, Se
91a0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
91b0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
91c0: 20 69 6e 74 20 69 2c 20 6a 2c 20 72 63 3b 0a 20   int i, j, rc;. 
91d0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
91e0: 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  t;.  Column *aCo
91f0: 6c 2c 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  l, *pCol;.  sqli
9200: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9210: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65  ->db;.  int save
9220: 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64  dFlags;..  saved
9230: 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67  Flags = db->flag
9240: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  s;.  db->flags &
9250: 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f  = ~SQLITE_FullCo
9260: 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c  lNames;.  db->fl
9270: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
9280: 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 72  ortColNames;.  r
9290: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
92a0: 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c  tResolve(pParse,
92b0: 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20   pSelect, 0);.  
92c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
92d0: 4b 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  K ){.    while( 
92e0: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
92f0: 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ) pSelect = pSel
9300: 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  ect->pPrior;.   
9310: 20 72 63 20 3d 20 70 72 65 70 53 65 6c 65 63 74   rc = prepSelect
9320: 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53 65  Stmt(pParse, pSe
9330: 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28 20 72  lect);.    if( r
9340: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
9350: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9360: 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
9370: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
9380: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
9390: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76   db->flags = sav
93a0: 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 72  edFlags;.  if( r
93b0: 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
93c0: 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20  0;.  }.  pTab = 
93d0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
93e0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
93f0: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
9400: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
9410: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
9420: 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 70  ab->db = db;.  p
9430: 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
9440: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pTab->zName = z
9450: 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65  TabName ? sqlite
9460: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 54  3DbStrDup(db, zT
9470: 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20 70  abName) : 0;.  p
9480: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
9490: 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54 61 62 2d  >pEList;.  pTab-
94a0: 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e  >nCol = pEList->
94b0: 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  nExpr;.  assert(
94c0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b   pTab->nCol>0 );
94d0: 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  .  pTab->aCol = 
94e0: 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  aCol = sqlite3Db
94f0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
9500: 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c  izeof(pTab->aCol
9510: 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 29  [0])*pTab->nCol)
9520: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 61 43  ;.  testcase( aC
9530: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  ol==0 );.  for(i
9540: 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69  =0, pCol=aCol; i
9550: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
9560: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 45  , pCol++){.    E
9570: 78 70 72 20 2a 70 3b 0a 20 20 20 20 63 68 61 72  xpr *p;.    char
9580: 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63 68 61   *zType;.    cha
9590: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e  r *zName;.    in
95a0: 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c  t nName;.    Col
95b0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
95c0: 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 4e 61   int cnt;.    Na
95d0: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
95e0: 20 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 61     .    /* Get a
95f0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61  n appropriate na
9600: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  me for the colum
9610: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d  n.    */.    p =
9620: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
9630: 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
9640: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c   p->pRight==0 ||
9650: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
9660: 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  n.z==0 || p->pRi
9670: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21  ght->token.z[0]!
9680: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  =0 );.    if( (z
9690: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
96a0: 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  [i].zName)!=0 ){
96b0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
96c0: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
96d0: 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20   an "AS <name>" 
96e0: 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d  phrase, use <nam
96f0: 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a  e> as the name *
9700: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
9710: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
9720: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
9730: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d  }else if( p->op=
9740: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d  =TK_COLUMN && p-
9750: 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 2f  >pTab ){.      /
9760: 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73  * For columns us
9770: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
9780: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
9790: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
97a0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28  olumn;.      if(
97b0: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
97c0: 20 70 2d 3e 70 54 61 62 2d 3e 69 50 4b 65 79 3b   p->pTab->iPKey;
97d0: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
97e0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
97f0: 2c 20 22 25 73 22 2c 20 70 2d 3e 70 54 61 62 2d  , "%s", p->pTab-
9800: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
9810: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
9820: 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20       /* Use the 
9830: 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66  original text of
9840: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72   the column expr
9850: 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61  ession as its na
9860: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
9870: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
9880: 74 66 28 64 62 2c 20 22 25 54 22 2c 20 26 70 2d  tf(db, "%T", &p-
9890: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  >span);.    }.  
98a0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
98b0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
98c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
98d0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
98e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
98f0: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
9900: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  zName);..    /* 
9910: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f  Make sure the co
9920: 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69  lumn name is uni
9930: 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d  que.  If the nam
9940: 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c  e is not unique,
9950: 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61  .    ** append a
9960: 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
9970: 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
9980: 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
9990: 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65      */.    nName
99a0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
99b0: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d  ;.    for(j=cnt=
99c0: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
99d0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
99e0: 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a  trICmp(aCol[j].z
99f0: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
9a00: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
9a10: 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20  *zNewName;.     
9a20: 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20     zName[nName] 
9a30: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65  = 0;.        zNe
9a40: 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  wName = sqlite3M
9a50: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 3a 25  Printf(db, "%s:%
9a60: 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74  d", zName, ++cnt
9a70: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9a80: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
9a90: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  me);.        zNa
9aa0: 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20  me = zNewName;. 
9ab0: 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20         j = -1;. 
9ac0: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
9ad0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
9ae0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
9af0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  Col->zName = zNa
9b00: 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20  me;..    /* Get 
9b10: 74 68 65 20 74 79 70 65 6e 61 6d 65 2c 20 74 79  the typename, ty
9b20: 70 65 20 61 66 66 69 6e 69 74 79 2c 20 61 6e 64  pe affinity, and
9b30: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
9b40: 6e 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20  nce for the.    
9b50: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a  ** column..    *
9b60: 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
9b70: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
9b80: 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  ));.    sNC.pSrc
9b90: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
9ba0: 70 53 72 63 3b 0a 20 20 20 20 7a 54 79 70 65 20  pSrc;.    zType 
9bb0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
9bc0: 70 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65  p(db, columnType
9bd0: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
9be0: 30 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a  0));.    pCol->z
9bf0: 54 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20  Type = zType;.  
9c00: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
9c10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
9c20: 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 70  finity(p);.    p
9c30: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
9c40: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
9c50: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , p);.    if( pC
9c60: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
9c70: 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  l->zColl = sqlit
9c80: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
9c90: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
9ca0: 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e    }.  }.  pTab->
9cb0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66  iPKey = -1;.  if
9cc0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
9cd0: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
9ce0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 54 61  3DeleteTable(pTa
9cf0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  b);.    return 0
9d00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
9d10: 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  Tab;.}../*.** Pr
9d20: 65 70 61 72 65 20 61 20 53 45 4c 45 43 54 20 73  epare a SELECT s
9d30: 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f  tatement for pro
9d40: 63 65 73 73 69 6e 67 20 62 79 20 64 6f 69 6e 67  cessing by doing
9d50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
9d60: 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20  * things:.**.** 
9d70: 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72     (1)  Make sur
9d80: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
9d90: 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
9da0: 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72  assigned to ever
9db0: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65  y.**         ele
9dc0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  ment of the FROM
9dd0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
9de0: 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74    (2)  Fill in t
9df0: 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
9e00: 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
9e10: 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
9e20: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
9e30: 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  ines FROM clause
9e40: 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70  .  When views ap
9e50: 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
9e60: 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20   clause,.**     
9e70: 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
9e80: 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
9e90: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
9ea0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
9eb0: 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
9ec0: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
9ed0: 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
9ee0: 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
9ef0: 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
9f00: 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
9f10: 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
9f20: 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
9f30: 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
9f40: 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
9f50: 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
9f60: 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
9f70: 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74  g up the presist
9f80: 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
9f90: 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
9fa0: 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
9fb0: 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72      (3)  Add ter
9fc0: 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
9fd0: 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f  clause to accomo
9fe0: 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c  date the NATURAL
9ff0: 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20   keyword.**     
a000: 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64      on joins and
a010: 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
a020: 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e  G clause of join
a030: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20  s..**.**    (4) 
a040: 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f   Scan the list o
a050: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
a060: 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c   result set (pEL
a070: 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20  ist) looking.** 
a080: 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74          for inst
a090: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22  ances of the "*"
a0a0: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65   operator or the
a0b0: 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f   TABLE.* operato
a0c0: 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66  r..**         If
a0d0: 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65   found, expand e
a0e0: 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76  ach "*" to be ev
a0f0: 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76  ery column in ev
a100: 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  ery table.**    
a110: 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a       and TABLE.*
a120: 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
a130: 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a  umn in TABLE..**
a140: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20  .** Return 0 on 
a150: 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
a160: 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c  re are problems,
a170: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
a180: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
a190: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
a1a0: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  non-zero..*/.sta
a1b0: 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65  tic int prepSele
a1c0: 63 74 53 74 6d 74 28 50 61 72 73 65 20 2a 70 50  ctStmt(Parse *pP
a1d0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
a1e0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c  {.  int i, j, k,
a1f0: 20 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   rc;.  SrcList *
a200: 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
a210: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
a220: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
a230: 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71  tem *pFrom;.  sq
a240: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a250: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
a260: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d  ==0 || p->pSrc==
a270: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
a280: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
a290: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 1;.  }.  pTa
a2a0: 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
a2b0: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
a2c0: 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  EList;..  /* Mak
a2d0: 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
a2e0: 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
a2f0: 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
a300: 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
a310: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
a320: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
a330: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
a340: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
a350: 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
a360: 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 0a 20  se, p->pSrc);.. 
a370: 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
a380: 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
a390: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
a3a0: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
a3b0: 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
a3c0: 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
a3d0: 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
a3e0: 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
a3f0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
a400: 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
a410: 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
a420: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
a430: 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
a440: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
a450: 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
a460: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
a470: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
a480: 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
a490: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69  ble *pTab;.    i
a4a0: 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  f( pFrom->pTab!=
a4b0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
a4c0: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  is statement has
a4d0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
a4e0: 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69  epared.  There i
a4f0: 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20  s no need.      
a500: 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72  ** to go further
a510: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
a520: 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( i==0 );.     
a530: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
a540: 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
a550: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e  zName==0 ){.#ifn
a560: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a570: 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 2f  SUBQUERY.      /
a580: 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
a590: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
a5a0: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
a5b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
a5c0: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  rom->pSelect!=0 
a5d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72  );.      if( pFr
a5e0: 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b  om->zAlias==0 ){
a5f0: 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
a600: 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20 20 20 20  zAlias =.       
a610: 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
a620: 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 75  f(db, "sqlite_su
a630: 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f  bquery_%p_", (vo
a640: 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  id*)pFrom->pSele
a650: 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
a660: 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
a670: 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
a680: 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
a690: 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
a6a0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
a6b0: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
a6c0: 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c  , pFrom->zAlias,
a6d0: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
a6e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
a6f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
a700: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
a710: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73  .      /* The is
a720: 45 70 68 65 6d 20 66 6c 61 67 20 69 6e 64 69 63  Ephem flag indic
a730: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 54 61  ates that the Ta
a740: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 61  ble structure ha
a750: 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a 20  s been.      ** 
a760: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
a770: 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20 62 65  cated and may be
a780: 20 66 72 65 65 64 20 61 74 20 61 6e 79 20 74 69   freed at any ti
a790: 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  me.  In other wo
a7a0: 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70 54  rds,.      ** pT
a7b0: 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  ab is not pointi
a7c0: 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73 74 65  ng to a persiste
a7d0: 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
a7e0: 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 0a  re that defines.
a7f0: 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f 66        ** part of
a800: 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a   the schema. */.
a810: 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73 45 70        pTab->isEp
a820: 68 65 6d 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  hem = 1;.#endif.
a830: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a840: 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
a850: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
a860: 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
a870: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
a880: 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
a890: 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
a8a0: 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
a8b0: 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
a8c0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
a8d0: 70 50 61 72 73 65 2c 30 2c 70 46 72 6f 6d 2d 3e  pParse,0,pFrom->
a8e0: 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61  zName,pFrom->zDa
a8f0: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69  tabase);.      i
a900: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
a910: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
a920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
a930: 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20  ab->nRef++;.#if 
a940: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a950: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
a960: 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f  efined (SQLITE_O
a970: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
a980: 29 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ).      if( pTab
a990: 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56  ->pSelect || IsV
a9a0: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
a9b0: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65          /* We re
a9c0: 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20  ach here if the 
a9d0: 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61  named table is a
a9e0: 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a   really a view *
a9f0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
aa00: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
aa10: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
aa20: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
aa30: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
aa40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
aa50: 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  * If pFrom->pSel
aa60: 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20  ect!=0 it means 
aa70: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
aa80: 69 74 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a  ith a.        **
aa90: 20 76 69 65 77 20 77 69 74 68 69 6e 20 61 20 76   view within a v
aaa0: 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54  iew.  The SELECT
aab0: 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20 61   structure has a
aac0: 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20  lready been.    
aad0: 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79      ** copied by
aae0: 20 74 68 65 20 6f 75 74 65 72 20 76 69 65 77 20   the outer view 
aaf0: 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74  so we can skip t
ab00: 68 65 20 63 6f 70 79 20 73 74 65 70 20 68 65 72  he copy step her
ab10: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  e.        ** in 
ab20: 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a  the inner view..
ab30: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
ab40: 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 53     if( pFrom->pS
ab50: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
ab60: 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65        pFrom->pSe
ab70: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
ab80: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
ab90: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
aba0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
abb0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ndif.    }.  }..
abc0: 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
abd0: 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
abe0: 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
abf0: 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
ac00: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
ac10: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
ac20: 50 61 72 73 65 2c 20 70 29 20 29 20 72 65 74 75  Parse, p) ) retu
ac30: 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  rn 1;..  /* For 
ac40: 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f  every "*" that o
ac50: 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c  ccurs in the col
ac60: 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74  umn list, insert
ac70: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20   the names of.  
ac80: 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  ** all columns i
ac90: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41  n all tables.  A
aca0: 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42  nd for every TAB
acb0: 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20  LE.* insert the 
acc0: 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c  names.  ** of al
acd0: 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42  l columns in TAB
ace0: 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  LE.  The parser 
acf0: 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69  inserted a speci
ad00: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  al expression.  
ad10: 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41  ** with the TK_A
ad20: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  LL operator for 
ad30: 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74  each "*" that it
ad40: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f   found in the co
ad50: 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20  lumn list..  ** 
ad60: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
ad70: 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c  de just has to l
ad80: 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c  ocate the TK_ALL
ad90: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
ada0: 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63   expand.  ** eac
adb0: 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
adc0: 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
add0: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a   in all tables..
ade0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
adf0: 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68  rst loop just ch
ae00: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
ae10: 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22  here are any "*"
ae20: 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20   operators.  ** 
ae30: 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64  that need expand
ae40: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
ae50: 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
ae60: 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
ae70: 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73  Expr *pE = pELis
ae80: 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
ae90: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
aea0: 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
aeb0: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
aec0: 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69  K_DOT && pE->pRi
aed0: 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68  ght && pE->pRigh
aee0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20  t->op==TK_ALL.  
aef0: 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c         && pE->pL
af00: 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  eft && pE->pLeft
af10: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72  ->op==TK_ID ) br
af20: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  eak;.  }.  rc = 
af30: 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73  0;.  if( k<pELis
af40: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
af50: 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
af60: 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
af70: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
af80: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
af90: 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
afa0: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
afb0: 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
afc0: 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
afd0: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
afe0: 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
aff0: 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
b000: 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
b010: 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
b020: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
b030: 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
b040: 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
b050: 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
b060: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
b070: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
b080: 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e  s;.    int longN
b090: 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20  ames = (flags & 
b0a0: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
b0b0: 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20  mes)!=0.        
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
b0d0: 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
b0e0: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d  _ShortColNames)=
b0f0: 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30  =0;..    for(k=0
b100: 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
b110: 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; k++){.      E
b120: 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70  xpr *pE = a[k].p
b130: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
b140: 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26  pE->op!=TK_ALL &
b150: 26 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 45  &.           (pE
b160: 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
b170: 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c  pE->pRight==0 ||
b180: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21   pE->pRight->op!
b190: 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20  =TK_ALL) ){.    
b1a0: 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
b1b0: 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
b1c0: 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
b1d0: 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
b1e0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
b1f0: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
b200: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
b210: 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b  pParse, pNew, a[
b220: 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  k].pExpr, 0);.  
b230: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
b240: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
b250: 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
b260: 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e  1].zName = a[k].
b270: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
b280: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
b290: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
b2a0: 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  }.        a[k].p
b2b0: 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
b2c0: 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
b2d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b2e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65         /* This e
b2f0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22  xpression is a "
b300: 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a  *" or a "TABLE.*
b310: 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  " and needs to b
b320: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
b330: 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  anded. */.      
b340: 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20    int tableSeen 
b350: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74  = 0;      /* Set
b360: 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45   to 1 when TABLE
b370: 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
b380: 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65      char *zTName
b390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b3a0: 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20  text of name of 
b3b0: 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20  TABLE */.       
b3c0: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
b3d0: 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  DOT && pE->pLeft
b3e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
b3f0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
b400: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
b410: 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  &pE->pLeft->toke
b420: 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  n);.        }els
b430: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  e{.          zTN
b440: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
b450: 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69   }.        for(i
b460: 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
b470: 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
b480: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
b490: 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  rom++){.        
b4a0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
b4b0: 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
b4c0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
b4d0: 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a  bName = pFrom->z
b4e0: 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
b4f0: 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
b500: 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d   || zTabName[0]=
b510: 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  =0 ){ .         
b520: 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54     zTabName = pT
b530: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
b540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b550: 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d   assert( zTabNam
b560: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  e );.          i
b570: 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c  f( zTName && sql
b580: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61  ite3StrICmp(zTNa
b590: 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30  me, zTabName)!=0
b5a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b5b0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
b5c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b5d0: 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20  tableSeen = 1;. 
b5e0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
b5f0: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
b600: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
b610: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a    Expr *pExpr, *
b620: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
b630: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
b640: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
b650: 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20  zName;..        
b660: 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75      /* If a colu
b670: 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  mn is marked as 
b680: 27 68 69 64 64 65 6e 27 20 28 63 75 72 72 65 6e  'hidden' (curren
b690: 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c  tly only possibl
b6a0: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
b6b0: 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62   for virtual tab
b6c0: 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63  les), do not inc
b6d0: 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65 20 65  lude it in the e
b6e0: 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20  xpanded.        
b6f0: 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65      ** result-se
b700: 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20  t list..        
b710: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
b720: 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e 43     if( IsHiddenC
b730: 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
b740: 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  l[j]) ){.       
b750: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 49 73         assert(Is
b760: 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b 0a  Virtual(pTab));.
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
b780: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
b790: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
b7a0: 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20     if( i>0 ){.  
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
b7c0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
b7d0: 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62 4c 69  *pLeft = &pTabLi
b7e0: 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20  st->a[i-1];.    
b7f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
b800: 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65  Left[1].jointype
b810: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
b820: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
b840: 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e  umnIndex(pLeft->
b850: 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  pTab, zName)>=0 
b860: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
b870: 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
b880: 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
b890: 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
b8a0: 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
b8b0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
b8c0: 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  e on the right *
b8d0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
b8e0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
b8f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b900: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
b910: 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
b920: 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73 69 6e 67  (pLeft[1].pUsing
b930: 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b950: 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
b960: 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
b970: 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
b980: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
b990: 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c       ** using cl
b9a0: 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61  ause from the ta
b9b0: 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
b9c0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
b9d0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
b9f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
ba00: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
ba10: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
ba20: 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c  Parse, TK_ID, 0,
ba30: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
ba40: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 3d 3d      if( pRight==
ba50: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
ba60: 20 20 20 20 20 20 20 73 65 74 51 75 6f 74 65 64         setQuoted
ba70: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 26 70  Token(pParse, &p
ba80: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e  Right->token, zN
ba90: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
baa0: 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
bab0: 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  || pTabList->nSr
bac0: 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>1 ){.         
bad0: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
bae0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
baf0: 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30  pParse, TK_ID, 0
bb00: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
bb10: 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
bb20: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
bb30: 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
bb40: 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  t, pRight, 0);. 
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
bb60: 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61   pExpr==0 ) brea
bb70: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
bb80: 20 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28   setQuotedToken(
bb90: 70 50 61 72 73 65 2c 20 26 70 4c 65 66 74 2d 3e  pParse, &pLeft->
bba0: 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29  token, zTabName)
bbb0: 3b 0a 23 69 66 20 31 0a 20 20 20 20 20 20 20 20  ;.#if 1.        
bbc0: 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26        setToken(&
bbd0: 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 0a 20 20  pExpr->span, .  
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbf0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
bc00: 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  b, "%s.%s", zTab
bc10: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20  Name, zName));. 
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
bc30: 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31  pr->span.dyn = 1
bc40: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  ;.#else.        
bc50: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
bc60: 6e 20 3d 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65  n = pRight->toke
bc70: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
bc80: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e   pExpr->span.dyn
bc90: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
bca0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
bcb0: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20  ->token.z = 0;. 
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
bcd0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b  pr->token.n = 0;
bce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
bcf0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  Expr->token.dyn 
bd00: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
bd10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bd20: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52        pExpr = pR
bd30: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
bd40: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20      pExpr->span 
bd50: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a  = pExpr->token;.
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
bd70: 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20  xpr->span.dyn = 
bd80: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
bd90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
bda0: 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20   longNames ){.  
bdb0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
bdc0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
bdd0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
bde0: 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70   pNew, pExpr, &p
bdf0: 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  Expr->span);.   
be00: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
be20: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
be30: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
be40: 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20  e, pNew, pExpr, 
be50: 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b  &pRight->token);
be60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
be70: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
be80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
be90: 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20   !tableSeen ){. 
bea0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
beb0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
bec0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
bed0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
bee0: 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
bef0: 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  zTName);.       
bf00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bf10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
bf20: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
bf30: 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69  o tables specifi
bf40: 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed");.          
bf50: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
bf60: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
bf70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
bf80: 72 65 65 28 64 62 2c 20 7a 54 4e 61 6d 65 29 3b  ree(db, zTName);
bf90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
bfa0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
bfb0: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c  stDelete(db, pEL
bfc0: 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c  ist);.    p->pEL
bfd0: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
bfe0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
bff0: 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70  OLUMN.  if( p->p
c000: 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69  EList && p->pELi
c010: 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c  st->nExpr>db->aL
c020: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
c030: 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20  T_COLUMN] ){.   
c040: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
c050: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
c060: 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65  ny columns in re
c070: 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 20 20  sult set");.    
c080: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
c090: 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  R;.  }.#endif.  
c0a0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
c0b0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d  iled ){.    rc =
c0c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
c0d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
c0e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 20 69 73 20 61  }../*.** pE is a
c0f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 65   pointer to an e
c100: 78 70 72 65 73 73 69 6f 6e 20 77 68 69 63 68 20  xpression which 
c110: 69 73 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  is a single term
c120: 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20   in.** ORDER BY 
c130: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
c140: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65  se..**.** At the
c150: 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74   point this rout
c160: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77  ine is called, w
c170: 65 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 20 74  e already know t
c180: 68 61 74 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52  hat the.** ORDER
c190: 20 42 59 20 74 65 72 6d 20 69 73 20 6e 6f 74 20   BY term is not 
c1a0: 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 64 65 78  an integer index
c1b0: 20 69 6e 74 6f 20 74 68 65 20 72 65 73 75 6c 74   into the result
c1c0: 20 73 65 74 2e 20 20 54 68 61 74 0a 2a 2a 20 63   set.  That.** c
c1d0: 61 73 65 65 20 69 73 20 68 61 6e 64 6c 65 64 20  asee is handled 
c1e0: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  by the calling r
c1f0: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  outine..**.** If
c200: 20 70 45 20 69 73 20 61 20 77 65 6c 6c 2d 66 6f   pE is a well-fo
c210: 72 6d 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20  rmed expression 
c220: 61 6e 64 20 74 68 65 20 53 45 4c 45 43 54 20 73  and the SELECT s
c230: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e  tatement.** is n
c240: 6f 74 20 63 6f 6d 70 6f 75 6e 64 2c 20 74 68 65  ot compound, the
c250: 6e 20 72 65 74 75 72 6e 20 30 2e 20 20 54 68 69  n return 0.  Thi
c260: 73 20 69 6e 64 69 63 61 74 65 73 20 74 6f 20 74  s indicates to t
c270: 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 68 61  he.** caller tha
c280: 74 20 69 74 20 73 68 6f 75 6c 64 20 73 6f 72 74  t it should sort
c290: 20 62 79 20 74 68 65 20 76 61 6c 75 65 20 6f 66   by the value of
c2a0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a   the ORDER BY.**
c2b0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
c2c0: 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54  ** If the SELECT
c2d0: 20 69 73 20 63 6f 6d 70 6f 75 6e 64 2c 20 74 68   is compound, th
c2e0: 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61  en attempt to ma
c2f0: 74 63 68 20 70 45 20 61 67 61 69 6e 73 74 0a 2a  tch pE against.*
c300: 2a 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c  * result set col
c310: 75 6d 6e 73 20 69 6e 20 74 68 65 20 6c 65 66 74  umns in the left
c320: 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
c330: 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a  tement.  Return.
c340: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 20 6f  ** the index i o
c350: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63  f the matching c
c360: 6f 6c 75 6d 6e 2c 20 61 73 20 61 6e 20 69 6e 64  olumn, as an ind
c370: 69 63 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 0a  ication to the .
c380: 2a 2a 20 63 61 6c 6c 65 72 20 74 68 61 74 20 69  ** caller that i
c390: 74 20 73 68 6f 75 6c 64 20 73 6f 72 74 20 62 79  t should sort by
c3a0: 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e   the i-th column
c3b0: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a  .  If there is.*
c3c0: 2a 20 6e 6f 20 6d 61 74 63 68 2c 20 72 65 74 75  * no match, retu
c3d0: 72 6e 20 2d 31 20 61 6e 64 20 6c 65 61 76 65 20  rn -1 and leave 
c3e0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
c3f0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 73   in pParse..*/.s
c400: 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f  tatic int matchO
c410: 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72  rderByTermToExpr
c420: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
c430: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
c440: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f  rsing context fo
c450: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
c460: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
c470: 65 6c 65 63 74 2c 20 20 20 2f 2a 20 54 68 65 20  elect,   /* The 
c480: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
c490: 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
c4a0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
c4b0: 78 70 72 20 2a 70 45 2c 20 20 20 20 20 20 20 20  xpr *pE,        
c4c0: 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69    /* The specifi
c4d0: 63 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  c ORDER BY term 
c4e0: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20  */.  int idx,   
c4f0: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20          /* When 
c500: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 69 73  ORDER BY term is
c510: 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 69   this */.  int i
c520: 73 43 6f 6d 70 6f 75 6e 64 2c 20 20 20 20 2f 2a  sCompound,    /*
c530: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
c540: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
c550: 43 54 20 2a 2f 0a 20 20 75 38 20 2a 70 48 61 73  CT */.  u8 *pHas
c560: 41 67 67 20 20 20 20 20 20 20 20 2f 2a 20 54 72  Agg        /* Tr
c570: 75 65 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e  ue if expression
c580: 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72 65 67   contains aggreg
c590: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
c5a0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
c5b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
c5c0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
c5d0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
c5e0: 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20   /* The columns 
c5f0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
c600: 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t */.  NameConte
c610: 78 74 20 6e 63 3b 20 20 20 20 2f 2a 20 4e 61 6d  xt nc;    /* Nam
c620: 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 72 65  e context for re
c630: 73 6f 6c 76 69 6e 67 20 70 45 20 2a 2f 0a 0a 20  solving pE */.. 
c640: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c650: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
c660: 2c 20 26 69 29 3d 3d 30 20 29 3b 0a 20 20 70 45  , &i)==0 );.  pE
c670: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
c680: 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 49 66  pEList;..  /* If
c690: 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73   the term is a s
c6a0: 69 6d 70 6c 65 20 69 64 65 6e 74 69 66 69 65 72  imple identifier
c6b0: 20 74 68 61 74 20 74 72 79 20 74 6f 20 6d 61 74   that try to mat
c6c0: 63 68 20 74 68 61 74 20 69 64 65 6e 74 69 66 69  ch that identifi
c6d0: 65 72 0a 20 20 2a 2a 20 61 67 61 69 6e 73 74 20  er.  ** against 
c6e0: 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 6e  a column name in
c6f0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
c700: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 2d 3e  .  */.  if( pE->
c710: 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 28 70 45  op==TK_ID || (pE
c720: 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op==TK_STRING 
c730: 26 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  && pE->token.z[0
c740: 5d 21 3d 27 5c 27 27 29 20 29 7b 0a 20 20 20 20  ]!='\'') ){.    
c750: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
c760: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 63 68  arse->db;.    ch
c770: 61 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69 74  ar *zCol = sqlit
c780: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
c790: 64 62 2c 20 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b  db, &pE->token);
c7a0: 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 3d 3d 30  .    if( zCol==0
c7b0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
c7c0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   -1;.    }.    f
c7d0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
c7e0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
c7f0: 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d       char *zAs =
c800: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
c810: 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ame;.      if( z
c820: 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  As!=0 && sqlite3
c830: 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f  StrICmp(zAs, zCo
c840: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
c850: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
c860: 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  b, zCol);.      
c870: 20 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20    return i+1;.  
c880: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
c890: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
c8a0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20  , zCol);.  }..  
c8b0: 2f 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e  /* Resolve all n
c8c0: 61 6d 65 73 20 69 6e 20 74 68 65 20 4f 52 44 45  ames in the ORDE
c8d0: 52 20 42 59 20 74 65 72 6d 20 65 78 70 72 65 73  R BY term expres
c8e0: 73 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  sion.  */.  mems
c8f0: 65 74 28 26 6e 63 2c 20 30 2c 20 73 69 7a 65 6f  et(&nc, 0, sizeo
c900: 66 28 6e 63 29 29 3b 0a 20 20 6e 63 2e 70 50 61  f(nc));.  nc.pPa
c910: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
c920: 6e 63 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  nc.pSrcList = pS
c930: 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 6e  elect->pSrc;.  n
c940: 63 2e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73  c.pEList = pELis
c950: 74 3b 0a 20 20 6e 63 2e 61 6c 6c 6f 77 41 67 67  t;.  nc.allowAgg
c960: 20 3d 20 31 3b 0a 20 20 6e 63 2e 6e 45 72 72 20   = 1;.  nc.nErr 
c970: 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 0;.  if( sqlit
c980: 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
c990: 65 73 28 26 6e 63 2c 20 70 45 29 20 29 7b 0a 20  es(&nc, pE) ){. 
c9a0: 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6f 75 6e     if( isCompoun
c9b0: 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
c9c0: 65 33 45 72 72 6f 72 43 6c 65 61 72 28 70 50 61  e3ErrorClear(pPa
c9d0: 72 73 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  rse);.      retu
c9e0: 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rn 0;.    }else{
c9f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
ca00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
ca10: 28 20 6e 63 2e 68 61 73 41 67 67 20 26 26 20 70  ( nc.hasAgg && p
ca20: 48 61 73 41 67 67 20 29 7b 0a 20 20 20 20 2a 70  HasAgg ){.    *p
ca30: 48 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a  HasAgg = 1;.  }.
ca40: 0a 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 6d 70  .  /* For a comp
ca50: 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 77 65 20  ound SELECT, we 
ca60: 6e 65 65 64 20 74 6f 20 74 72 79 20 74 6f 20 6d  need to try to m
ca70: 61 74 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  atch the ORDER B
ca80: 59 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  Y.  ** expressio
ca90: 6e 20 61 67 61 69 6e 73 74 20 61 6e 20 65 78 70  n against an exp
caa0: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72  ression in the r
cab0: 65 73 75 6c 74 20 73 65 74 0a 20 20 2a 2f 0a 20  esult set.  */. 
cac0: 20 69 66 28 20 69 73 43 6f 6d 70 6f 75 6e 64 20   if( isCompound 
cad0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
cae0: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
caf0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
cb00: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
cb10: 61 72 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  are(pEList->a[i]
cb20: 2e 70 45 78 70 72 2c 20 70 45 29 20 29 7b 0a 20  .pExpr, pE) ){. 
cb30: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 2b         return i+
cb40: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
cb50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
cb60: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  .}.../*.** Analy
cb70: 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  ze and ORDER BY 
cb80: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
cb90: 73 65 20 69 6e 20 61 20 73 69 6d 70 6c 65 20 53  se in a simple S
cba0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
cbb0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
cbc0: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
cbd0: 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72  seen..**.** Ever
cbe0: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  y term of the OR
cbf0: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
cc00: 42 59 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20  BY clause needs 
cc10: 74 6f 20 62 65 20 61 6e 0a 2a 2a 20 65 78 70 72  to be an.** expr
cc20: 65 73 73 69 6f 6e 2e 20 20 49 66 20 61 6e 79 20  ession.  If any 
cc30: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
cc40: 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   integer constan
cc50: 74 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 61 74 20  t, then.** that 
cc60: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65  expression is re
cc70: 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 63 6f  placed by the co
cc80: 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 2a 2a 20  rresponding .** 
cc90: 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
cca0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
ccb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
ccc0: 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42  ocessOrderGroupB
ccd0: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
cce0: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
ccf0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20  rsing context.  
cd00: 4c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73  Leave error mess
cd10: 61 67 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 53  ages here */.  S
cd20: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
cd30: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
cd40: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e  CT statement con
cd50: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6c 61 75  taining the clau
cd60: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
cd70: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
cd80: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72   The ORDER BY or
cd90: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
cda0: 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64   to be processed
cdb0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 72 64 65   */.  int isOrde
cdc0: 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31  r,          /* 1
cdd0: 20 66 6f 72 20 4f 52 44 45 52 20 42 59 2e 20 20   for ORDER BY.  
cde0: 30 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 2a  0 for GROUP BY *
cdf0: 2f 0a 20 20 75 38 20 2a 70 48 61 73 41 67 67 20  /.  u8 *pHasAgg 
ce00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
ce10: 20 74 6f 20 54 52 55 45 20 69 66 20 61 6e 79 20   to TRUE if any 
ce20: 74 65 72 6d 20 63 6f 6e 74 61 69 6e 73 20 61 6e  term contains an
ce30: 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 29 7b   aggregate */.){
ce40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
ce50: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
ce60: 2d 3e 64 62 3b 0a 20 20 45 78 70 72 4c 69 73 74  ->db;.  ExprList
ce70: 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28   *pEList;..  if(
ce80: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20   pOrderBy==0 || 
ce90: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
cea0: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
ceb0: 6e 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  n 0;.#if SQLITE_
cec0: 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28  MAX_COLUMN.  if(
ced0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
cee0: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
cef0: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
cf00: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
cf10: 61 72 20 2a 7a 54 79 70 65 20 3d 20 69 73 4f 72  ar *zType = isOr
cf20: 64 65 72 20 3f 20 22 4f 52 44 45 52 22 20 3a 20  der ? "ORDER" : 
cf30: 22 47 52 4f 55 50 22 3b 0a 20 20 20 20 73 71 6c  "GROUP";.    sql
cf40: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
cf50: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74  rse, "too many t
cf60: 65 72 6d 73 20 69 6e 20 25 73 20 42 59 20 63 6c  erms in %s BY cl
cf70: 61 75 73 65 22 2c 20 7a 54 79 70 65 29 3b 0a 20  ause", zType);. 
cf80: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
cf90: 0a 23 65 6e 64 69 66 0a 20 20 70 45 4c 69 73 74  .#endif.  pEList
cfa0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
cfb0: 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
cfc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
cfd0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  n 0;.  }.  for(i
cfe0: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
cff0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
d000: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 45   int iCol;.    E
d010: 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72  xpr *pE = pOrder
d020: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
d030: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
d040: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
d050: 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20   &iCol) ){.     
d060: 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20   if( iCol<=0 || 
d070: 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
d080: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  pr ){.        co
d090: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
d0a0: 3d 20 69 73 4f 72 64 65 72 20 3f 20 22 4f 52 44  = isOrder ? "ORD
d0b0: 45 52 22 20 3a 20 22 47 52 4f 55 50 22 3b 0a 20  ER" : "GROUP";. 
d0c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
d0d0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
d0e0: 20 20 20 20 20 20 20 20 20 20 20 22 25 72 20 25             "%r %
d0f0: 73 20 42 59 20 74 65 72 6d 20 6f 75 74 20 6f 66  s BY term out of
d100: 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20   range - should 
d110: 62 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  be ".           
d120: 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25  "between 1 and %
d130: 64 22 2c 20 69 2b 31 2c 20 7a 54 79 70 65 2c 20  d", i+1, zType, 
d140: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
d150: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
d160: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
d170: 6c 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 20  lse{.      iCol 
d180: 3d 20 6d 61 74 63 68 4f 72 64 65 72 42 79 54 65  = matchOrderByTe
d190: 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 70 50 61  rmToExprList(pPa
d1a0: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 45  rse, pSelect, pE
d1b0: 2c 20 69 2b 31 2c 20 30 2c 20 70 48 61 73 41 67  , i+1, 0, pHasAg
d1c0: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  g);.      if( iC
d1d0: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
d1e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
d1f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
d200: 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20  iCol>0 ){.      
d210: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
d220: 20 70 45 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20   pE->pColl;.    
d230: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 45    int flags = pE
d240: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
d250: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 73  Collate;.      s
d260: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
d270: 28 64 62 2c 20 70 45 29 3b 0a 20 20 20 20 20 20  (db, pE);.      
d280: 70 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pE = sqlite3Expr
d290: 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e  Dup(db, pEList->
d2a0: 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29  a[iCol-1].pExpr)
d2b0: 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ;.      pOrderBy
d2c0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70  ->a[i].pExpr = p
d2d0: 45 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 20  E;.      if( pE 
d2e0: 26 26 20 70 43 6f 6c 6c 20 26 26 20 66 6c 61 67  && pColl && flag
d2f0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 2d  s ){.        pE-
d300: 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  >pColl = pColl;.
d310: 20 20 20 20 20 20 20 20 70 45 2d 3e 66 6c 61 67          pE->flag
d320: 73 20 7c 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20  s |= flags;.    
d330: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
d340: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
d350: 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20 4f  ** Analyze and O
d360: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
d370: 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20   BY clause in a 
d380: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d390: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
d3a0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
d3b0: 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  s seen..**.** If
d3c0: 20 69 54 61 62 6c 65 3e 30 20 74 68 65 6e 20 6d   iTable>0 then m
d3d0: 61 6b 65 20 74 68 65 20 4e 2d 74 68 20 74 65 72  ake the N-th ter
d3e0: 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
d3f0: 59 20 63 6c 61 75 73 65 20 72 65 66 65 72 20 74  Y clause refer t
d400: 6f 0a 2a 2a 20 74 68 65 20 4e 2d 74 68 20 63 6f  o.** the N-th co
d410: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 54  lumn of table iT
d420: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  able..**.** If i
d430: 54 61 62 6c 65 3d 3d 30 20 74 68 65 6e 20 74 72  Table==0 then tr
d440: 61 6e 73 66 6f 72 6d 20 65 61 63 68 20 74 65 72  ansform each ter
d450: 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
d460: 59 20 63 6c 61 75 73 65 20 74 6f 20 72 65 66 65  Y clause to refe
d470: 72 0a 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  r.** to a column
d480: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
d490: 65 74 20 62 79 20 6e 75 6d 62 65 72 2e 0a 2a 2f  et by number..*/
d4a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63  .static int proc
d4b0: 65 73 73 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72  essCompoundOrder
d4c0: 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
d4d0: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
d4e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20  arsing context. 
d4f0: 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73   Leave error mes
d500: 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a 20 20  sages here */.  
d510: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
d520: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
d530: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  ECT statement co
d540: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 4f 52 44  ntaining the ORD
d550: 45 52 20 42 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ER BY */.){.  in
d560: 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  t i;.  ExprList 
d570: 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 45 78 70  *pOrderBy;.  Exp
d580: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
d590: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
d5a0: 69 6e 74 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31  int moreToDo = 1
d5b0: 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  ;..  pOrderBy = 
d5c0: 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42  pSelect->pOrderB
d5d0: 79 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  y;.  if( pOrderB
d5e0: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y==0 ) return 0;
d5f0: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
d600: 64 62 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  db;.#if SQLITE_M
d610: 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
d620: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e  pOrderBy->nExpr>
d630: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
d640: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
d650: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d660: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d670: 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69  too many terms i
d680: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
d690: 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e");.    return 
d6a0: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  1;.  }.#endif.  
d6b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
d6c0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
d6d0: 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e  {.    pOrderBy->
d6e0: 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20  a[i].done = 0;. 
d6f0: 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c   }.  while( pSel
d700: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ect->pPrior ){. 
d710: 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65     pSelect = pSe
d720: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
d730: 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  }.  while( pSele
d740: 63 74 20 26 26 20 6d 6f 72 65 54 6f 44 6f 20 29  ct && moreToDo )
d750: 7b 0a 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d  {.    moreToDo =
d760: 20 30 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d   0;.    pEList =
d770: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
d780: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
d790: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
d7a0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
d7b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
d7c0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
d7d0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
d7e0: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 45 78  l = -1;.      Ex
d7f0: 70 72 20 2a 70 45 2c 20 2a 70 44 75 70 3b 0a 20  pr *pE, *pDup;. 
d800: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
d810: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63  y->a[i].done ) c
d820: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
d830: 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
d840: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
d850: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
d860: 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
d870: 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ol) ){.        i
d880: 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f  f( iCol<0 || iCo
d890: 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  l>pEList->nExpr 
d8a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
d8b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
d8c0: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
d8d0: 20 20 20 22 25 72 20 4f 52 44 45 52 20 42 59 20     "%r ORDER BY 
d8e0: 74 65 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67  term out of rang
d8f0: 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a  e - should be ".
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 62 65               "be
d910: 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c  tween 1 and %d",
d920: 20 69 2b 31 2c 20 70 45 4c 69 73 74 2d 3e 6e 45   i+1, pEList->nE
d930: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
d940: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
d950: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
d960: 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20  .        pDup = 
d970: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
d980: 62 2c 20 70 45 29 3b 0a 20 20 20 20 20 20 20 20  b, pE);.        
d990: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
d9a0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
d9b0: 20 20 20 61 73 73 65 72 74 28 70 44 75 70 29 3b     assert(pDup);
d9c0: 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20  .          iCol 
d9d0: 3d 20 6d 61 74 63 68 4f 72 64 65 72 42 79 54 65  = matchOrderByTe
d9e0: 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 70 50 61  rmToExprList(pPa
d9f0: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 44  rse, pSelect, pD
da00: 75 70 2c 20 69 2b 31 2c 20 31 2c 20 30 29 3b 0a  up, i+1, 1, 0);.
da10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
da20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
da30: 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20  ete(db, pDup);. 
da40: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
da50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
da60: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
da70: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
da80: 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20   if( iCol>0 ){. 
da90: 20 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20         pE->op = 
daa0: 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TK_INTEGER;.    
dab0: 20 20 20 20 70 45 2d 3e 66 6c 61 67 73 20 7c 3d      pE->flags |=
dac0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
dad0: 20 20 20 20 20 20 70 45 2d 3e 69 54 61 62 6c 65        pE->iTable
dae0: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20   = iCol;.       
daf0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
db00: 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  done = 1;.      
db10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
db20: 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 20 20 20  oreToDo = 1;.   
db30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
db40: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
db50: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 66  ->pNext;.  }.  f
db60: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
db70: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
db80: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
db90: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 3d 3d 30 20  y->a[i].done==0 
dba0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
dbb0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
dbc0: 20 22 25 72 20 4f 52 44 45 52 20 42 59 20 74 65   "%r ORDER BY te
dbd0: 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  rm does not matc
dbe0: 68 20 61 6e 79 20 22 0a 20 20 20 20 20 20 20 20  h any ".        
dbf0: 20 20 20 20 22 63 6f 6c 75 6d 6e 20 69 6e 20 74      "column in t
dc00: 68 65 20 72 65 73 75 6c 74 20 73 65 74 22 2c 20  he result set", 
dc10: 69 2b 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75  i+1);.      retu
dc20: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
dc30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
dc40: 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20  *.** Get a VDBE 
dc50: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
dc60: 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43  rser context.  C
dc70: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
dc80: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
dc90: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
dca0: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
dcb0: 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73   and leave a mes
dcc0: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
dcd0: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  */.Vdbe *sqlite3
dce0: 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70  GetVdbe(Parse *p
dcf0: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
dd00: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
dd10: 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  e;.  if( v==0 ){
dd20: 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d  .    v = pParse-
dd30: 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33  >pVdbe = sqlite3
dd40: 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73  VdbeCreate(pPars
dd50: 65 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65 66 20  e->db);.#ifndef 
dd60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
dd70: 45 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20  E.    if( v ){. 
dd80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dd90: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61  AddOp0(v, OP_Tra
dda0: 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ce);.    }.#endi
ddb0: 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76  f.  }.  return v
ddc0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ;.}.../*.** Comp
ddd0: 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61  ute the iLimit a
dde0: 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64  nd iOffset field
ddf0: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
de00: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
de10: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
de20: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  et expressions. 
de30: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
de40: 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70  set hold the exp
de50: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
de60: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f   appear in the o
de70: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
de80: 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20  ement after the 
de90: 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
dea0: 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f  .** keywords.  O
deb0: 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20  r NULL if those 
dec0: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69  keywords are omi
ded0: 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64  tted. iLimit and
dee0: 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65   iOffset .** are
def0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d   the integer mem
df00: 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ory register num
df10: 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72  bers for counter
df20: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  s used to comput
df30: 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20  e .** the limit 
df40: 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20  and offset.  If 
df50: 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69  there is no limi
df60: 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c  t and/or offset,
df70: 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74   then .** iLimit
df80: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65   and iOffset are
df90: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
dfa0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
dfb0: 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73  anges the values
dfc0: 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69   of iLimit and i
dfd0: 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a  Offset only if.*
dfe0: 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66  * a limit or off
dff0: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
e000: 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  y pLimit and pOf
e010: 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e  fset.  iLimit an
e020: 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f  d.** iOffset sho
e030: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72  uld have been pr
e040: 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69  eset to appropri
e050: 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ate default valu
e060: 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62  es.** (usually b
e070: 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31  ut not always -1
e080: 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  ) prior to calli
e090: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
e0a0: 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d  .** Only if pLim
e0b0: 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74  it!=0 or pOffset
e0c0: 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
e0d0: 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
e0e0: 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
e0f0: 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
e100: 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
e110: 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
e120: 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
e130: 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
e140: 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
e150: 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
e160: 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
e170: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
e180: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
e190: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
e1a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
e1b0: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
e1c0: 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
e1d0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
e1e0: 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
e1f0: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64  ffset;.  int add
e200: 72 31 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  r1;.  if( p->iLi
e210: 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  mit ) return;.. 
e220: 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54   /* .  ** "LIMIT
e230: 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77   -1" always show
e240: 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65  s all rows.  The
e250: 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20  re is some.  ** 
e260: 63 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75  contraversy abou
e270: 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65  t what the corre
e280: 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75  ct behavior shou
e290: 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20  ld be..  ** The 
e2a0: 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
e2b0: 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74  tation interpret
e2c0: 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d  s "LIMIT 0" to m
e2d0: 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73  ean.  ** no rows
e2e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
e2f0: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d  pLimit ){.    p-
e300: 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74  >iLimit = iLimit
e310: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
e320: 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  m;.    v = sqlit
e330: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
e340: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
e350: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71  ) return;.    sq
e360: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
e370: 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  arse, p->pLimit,
e380: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71   iLimit);.    sq
e390: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
e3a0: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
e3b0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 56 64   iLimit);.    Vd
e3c0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
e3d0: 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
e3e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e3f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a  AddOp2(v, OP_IfZ
e400: 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72  ero, iLimit, iBr
e410: 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  eak);.  }.  if( 
e420: 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
e430: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69    p->iOffset = i
e440: 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Offset = ++pPars
e450: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28  e->nMem;.    if(
e460: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
e470: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
e480: 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  ++;   /* Allocat
e490: 65 20 61 6e 20 65 78 74 72 61 20 72 65 67 69 73  e an extra regis
e4a0: 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66  ter for limit+of
e4b0: 66 73 65 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  fset */.    }.  
e4c0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
e4d0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
e4e0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
e4f0: 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
e500: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
e510: 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66   p->pOffset, iOf
e520: 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  fset);.    sqlit
e530: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
e540: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f  OP_MustBeInt, iO
e550: 66 66 73 65 74 29 3b 0a 20 20 20 20 56 64 62 65  ffset);.    Vdbe
e560: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
e570: 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  SET counter"));.
e580: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
e590: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
e5a0: 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73   OP_IfPos, iOffs
e5b0: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  et);.    sqlite3
e5c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e5d0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f 66  _Integer, 0, iOf
e5e0: 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  fset);.    sqlit
e5f0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
e600: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 69 66  , addr1);.    if
e610: 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ( p->pLimit ){. 
e620: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e630: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64  AddOp3(v, OP_Add
e640: 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65  , iLimit, iOffse
e650: 74 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20  t, iOffset+1);. 
e660: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
e670: 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53  ((v, "LIMIT+OFFS
e680: 45 54 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64  ET"));.      add
e690: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
e6a0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50  AddOp1(v, OP_IfP
e6b0: 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  os, iLimit);.   
e6c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e6d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
e6e0: 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b  er, -1, iOffset+
e6f0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
e700: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
e710: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20   addr1);.    }. 
e720: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
e730: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
e740: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
e750: 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  Return the appro
e760: 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67  priate collating
e770: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
e780: 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
e790: 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   of.** the resul
e7a0: 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f  t set for the co
e7b0: 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74  mpound-select st
e7c0: 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65  atement "p".  Re
e7d0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20  turn NULL if.** 
e7e0: 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e  the column has n
e7f0: 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  o default collat
e800: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
e810: 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e  .** The collatin
e820: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
e830: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
e840: 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ct is taken from
e850: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
e860: 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65  t term of the se
e870: 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20  lect that has a 
e880: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
e890: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f  ce..*/.static Co
e8a0: 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65  llSeq *multiSele
e8b0: 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  ctCollSeq(Parse 
e8c0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
e8d0: 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  *p, int iCol){. 
e8e0: 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a   CollSeq *pRet;.
e8f0: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
e900: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75  ){.    pRet = mu
e910: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
e920: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69  (pParse, p->pPri
e930: 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c  or, iCol);.  }el
e940: 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30  se{.    pRet = 0
e950: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 65 74  ;.  }.  if( pRet
e960: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52 65 74 20  ==0 ){.    pRet 
e970: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
e980: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
e990: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
e9a0: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
e9b0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e  turn pRet;.}.#en
e9c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
e9d0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
e9e0: 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72  CT */../* Forwar
e9f0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
ea00: 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
ea10: 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20  electOrderBy(.  
ea20: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
ea30: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
ea40: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
ea50: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
ea60: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
ea70: 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
ea80: 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
ea90: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
eaa0: 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
eab0: 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
eac0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a   results */.);..
ead0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
eae0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
eaf0: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  LECT./*.** This 
eb00: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
eb10: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63  d to process a c
eb20: 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f  ompound query fo
eb30: 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f  rm from.** two o
eb40: 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20  r more separate 
eb50: 71 75 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e  queries using UN
eb60: 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  ION, UNION ALL, 
eb70: 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e  EXCEPT, or.** IN
eb80: 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70  TERSECT.**.** "p
eb90: 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  " points to the 
eba0: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68  right-most of th
ebb0: 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20  e two queries.  
ebc0: 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65  the query on the
ebd0: 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70  .** left is p->p
ebe0: 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74  Prior.  The left
ebf0: 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73   query could als
ec00: 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20  o be a compound 
ec10: 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63  query.** in whic
ec20: 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  h case this rout
ec30: 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
ec40: 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20  ed recursively. 
ec50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
ec60: 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20  ts of the total 
ec70: 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20  query are to be 
ec80: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64  written into a d
ec90: 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66  estination.** of
eca0: 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68   type eDest with
ecb0: 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d   parameter iParm
ecc0: 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20  ..**.** Example 
ecd0: 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74  1:  Consider a t
ece0: 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e  hree-way compoun
ecf0: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  d SQL statement.
ed00: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
ed10: 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f  T a FROM t1 UNIO
ed20: 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  N SELECT b FROM 
ed30: 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t2 UNION SELECT 
ed40: 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20  c FROM t3.**.** 
ed50: 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69  This statement i
ed60: 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66  s parsed up as f
ed70: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
ed80: 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20    SELECT c FROM 
ed90: 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20  t3.**      |.** 
eda0: 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45       `----->  SE
edb0: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a  LECT b FROM t2.*
edc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
edd0: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
ede0: 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53       `------>  S
edf0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a  ELECT a FROM t1.
ee00: 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73  **.** The arrows
ee10: 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20   in the diagram 
ee20: 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20  above represent 
ee30: 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f  the Select.pPrio
ee40: 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f  r pointer..** So
ee50: 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
ee60: 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
ee70: 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  p equal to the t
ee80: 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a  3 query, then.**
ee90: 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20   pPrior will be 
eea0: 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70  the t2 query.  p
eeb0: 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f  ->op will be TK_
eec0: 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61  UNION in this ca
eed0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65  se..**.** Notice
eee0: 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66   that because of
eef0: 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20   the way SQLite 
ef00: 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20  parses compound 
ef10: 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20  SELECTs, the.** 
ef20: 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63  individual selec
ef30: 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20  ts always group 
ef40: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
ef50: 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ht..*/.static in
ef60: 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20  t multiSelect(. 
ef70: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ef80: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
ef90: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
efa0: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
efb0: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
efc0: 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
efd0: 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
efe0: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
eff0: 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
f000: 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
f010: 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
f020: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f030: 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65  E_OK;   /* Succe
f040: 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73  ss code from a s
f050: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53  ubroutine */.  S
f060: 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
f070: 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
f080: 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
f090: 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
f0a0: 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
f0b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
f0c0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
f0d0: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c  is VDBE */.  Sel
f0e0: 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20  ectDest dest;   
f0f0: 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76     /* Alternativ
f100: 65 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69  e data destinati
f110: 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
f120: 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a  pDelete = 0;  /*
f130: 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65   Chain of simple
f140: 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65   selects to dele
f150: 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  te */.  sqlite3 
f160: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *db;          /*
f170: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
f180: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61  tion */..  /* Ma
f190: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
f1a0: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
f1b0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
f1c0: 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
f1d0: 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61  Only.  ** the la
f1e0: 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20  st (right-most) 
f1f0: 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65  SELECT in the se
f200: 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e  ries may have an
f210: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
f220: 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  IT..  */.  asser
f230: 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f  t( p && p->pPrio
f240: 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67  r );  /* Calling
f250: 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e   function guaran
f260: 74 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a  tees this much *
f270: 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
f280: 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  >db;.  pPrior = 
f290: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  p->pPrior;.  ass
f2a0: 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69  ert( pPrior->pRi
f2b0: 67 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20  ghtmost!=pPrior 
f2c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  );.  assert( pPr
f2d0: 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ior->pRightmost=
f2e0: 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29  =p->pRightmost )
f2f0: 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73  ;.  dest = *pDes
f300: 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  t;.  if( pPrior-
f310: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
f320: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f330: 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42  (pParse,"ORDER B
f340: 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  Y clause should 
f350: 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
f360: 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
f370: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
f380: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
f390: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
f3a0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
f3b0: 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  }.  if( pPrior->
f3c0: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
f3d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
f3e0: 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75  arse,"LIMIT clau
f3f0: 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
f400: 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
f410: 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
f420: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
f430: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
f440: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
f450: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76  ct_end;.  }..  v
f460: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
f470: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
f480: 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a  ert( v!=0 );  /*
f490: 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64   The VDBE alread
f4a0: 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c  y created by cal
f4b0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ling function */
f4c0: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
f4d0: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65  e destination te
f4e0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66  mporary table if
f4f0: 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a   necessary.  */.
f500: 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
f510: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
f520: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
f530: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73  >pEList );.    s
f540: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f550: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
f560: 65 72 61 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d  eral, dest.iParm
f570: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
f580: 70 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44  pr);.    dest.eD
f590: 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b  est = SRT_Table;
f5a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
f5b0: 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73  sure all SELECTs
f5c0: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
f5d0: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
f5e0: 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
f5f0: 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72  ts.  ** in their
f600: 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20   result sets..  
f610: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
f620: 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72  pEList && pPrior
f630: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66  ->pEList );.  if
f640: 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ( p->pEList->nEx
f650: 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69  pr!=pPrior->pELi
f660: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
f670: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f680: 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54  (pParse, "SELECT
f690: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e  s to the left an
f6a0: 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20  d right of %s". 
f6b0: 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61       " do not ha
f6c0: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
f6d0: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
f6e0: 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e  umns", selectOpN
f6f0: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
f700: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
f710: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
f720: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  nd;.  }..  /* Co
f730: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74  mpound SELECTs t
f740: 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45  hat have an ORDE
f750: 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
f760: 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
f770: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ly..  */.  if( p
f780: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
f790: 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
f7a0: 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72  lectOrderBy(pPar
f7b0: 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
f7c0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
f7d0: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c  e code for the l
f7e0: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45  eft and right SE
f7f0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
f800: 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20  .  */.  switch( 
f810: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
f820: 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20  e TK_ALL: {.    
f830: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a    int addr = 0;.
f840: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
f850: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b  Prior->pLimit );
f860: 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
f870: 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
f880: 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
f890: 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  >pOffset = p->pO
f8a0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 72 63 20  ffset;.      rc 
f8b0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
f8c0: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
f8d0: 26 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 29 3b  &dest, 0, 0, 0);
f8e0: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
f8f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
f900: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
f910: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
f920: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
f930: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
f940: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
f950: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  or = 0;.      p-
f960: 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72  >iLimit = pPrior
f970: 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
f980: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72  p->iOffset = pPr
f990: 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  ior->iOffset;.  
f9a0: 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69      if( p->iLimi
f9b0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64  t ){.        add
f9c0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
f9d0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp1(v, OP_IfZe
f9e0: 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a  ro, p->iLimit);.
f9f0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
fa00: 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68  ent((v, "Jump ah
fa10: 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61  ead if LIMIT rea
fa20: 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d  ched"));.      }
fa30: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
fa40: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
fa50: 2c 20 70 2c 20 26 64 65 73 74 2c 20 30 2c 20 30  , p, &dest, 0, 0
fa60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  , 0);.      pDel
fa70: 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
fa80: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
fa90: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
faa0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
fab0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
fac0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
fad0: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  }.      if( addr
fae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
faf0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
fb00: 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
fb10: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
fb20: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
fb30: 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73  _EXCEPT:.    cas
fb40: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20  e TK_UNION: {.  
fb50: 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
fb60: 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
fb70: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
fb80: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c  porary table hol
fb90: 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20  ding result */. 
fba0: 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b       int op = 0;
fbb0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
fbc0: 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
fbd0: 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
fbe0: 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  self */.      in
fbf0: 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f  t priorOp;     /
fc00: 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61  * The SRT_ opera
fc10: 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f  tion to apply to
fc20: 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a   prior selects *
fc30: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  /.      Expr *pL
fc40: 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20  imit, *pOffset; 
fc50: 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20  /* Saved values 
fc60: 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64  of p->nLimit and
fc70: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20   p->nOffset */. 
fc80: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
fc90: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
fca0: 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20  uniondest;..    
fcb0: 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f    priorOp = SRT_
fcc0: 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  Union;.      if(
fcd0: 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69   dest.eDest==pri
fce0: 6f 72 4f 70 20 26 26 20 21 70 2d 3e 70 4c 69 6d  orOp && !p->pLim
fcf0: 69 74 20 26 26 20 21 70 2d 3e 70 4f 66 66 73 65  it && !p->pOffse
fd00: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
fd10: 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74  We can reuse a t
fd20: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67  emporary table g
fd30: 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45  enerated by a SE
fd40: 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20  LECT to our.    
fd50: 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20      ** right..  
fd60: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
fd70: 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74   unionTab = dest
fd80: 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65  .iParm;.      }e
fd90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
fda0: 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  We will need to 
fdb0: 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74  create our own t
fdc0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
fdd0: 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20  o hold the.     
fde0: 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61     ** intermedia
fdf0: 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20  te results..    
fe00: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
fe10: 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65  nionTab = pParse
fe20: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
fe30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
fe40: 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
fe50: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
fe60: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fe70: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
fe80: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
fe90: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
fea0: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
feb0: 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
fec0: 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
fed0: 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
fee0: 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74         p->pRight
fef0: 6d 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d 20 3d  most->usesEphm =
ff00: 20 31 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   1;.        asse
ff10: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
ff20: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
ff30: 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
ff40: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
ff50: 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20   our left.      
ff60: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
ff70: 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72   !pPrior->pOrder
ff80: 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  By );.      sqli
ff90: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
ffa0: 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72  t(&uniondest, pr
ffb0: 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29  iorOp, unionTab)
ffc0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
ffd0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
ffe0: 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f  e, pPrior, &unio
fff0: 6e 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 29 3b  ndest, 0, 0, 0);
10000 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
10010 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
10020 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
10030 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
10040 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
10050 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nt SELECT statem
10060 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ent.      */.   
10070 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
10080 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20  _EXCEPT ){.     
10090 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65     op = SRT_Exce
100a0 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  pt;.      }else{
100b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
100c0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
100d0 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   );.        op =
100e0 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
100f0 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
10100 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
10110 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42  ->disallowOrderB
10120 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69  y = 0;.      pLi
10130 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
10140 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
10150 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66   = 0;.      pOff
10160 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
10170 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
10180 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e  et = 0;.      un
10190 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20  iondest.eDest = 
101a0 6f 70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  op;.      rc = s
101b0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
101c0 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65  rse, p, &unionde
101d0 73 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  st, 0, 0, 0);.  
101e0 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61      /* Query fla
101f0 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74  ttening in sqlit
10200 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74  e3Select() might
10210 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65   refill p->pOrde
10220 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65  rBy..      ** Be
10230 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20   sure to delete 
10240 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65  p->pOrderBy, the
10250 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64  refore, to avoid
10260 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20   a memory leak. 
10270 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
10280 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
10290 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
102a0 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
102b0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
102c0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
102d0 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
102e0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
102f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
10300 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
10310 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  it);.      p->pL
10320 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
10330 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
10340 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  = pOffset;.     
10350 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->iLimit = 0;.
10360 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
10370 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
10380 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
10390 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
103a0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20  end;.      }... 
103b0 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
103c0 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20  the data in the 
103d0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
103e0 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
103f0 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  rm.      ** it i
10400 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e  s that we curren
10410 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  tly need..      
10420 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20 69  */      .      i
10430 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70  f( dest.eDest!=p
10440 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54  riorOp || unionT
10450 61 62 21 3d 64 65 73 74 2e 69 50 61 72 6d 20 29  ab!=dest.iParm )
10460 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
10470 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
10480 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  art;.        ass
10490 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
104a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65  ;.        if( de
104b0 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  st.eDest==SRT_Ca
104c0 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
104d0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
104e0 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
104f0 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
10500 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
10510 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
10520 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  r;.          gen
10530 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
10540 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
10550 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  st->pEList);.   
10560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
10570 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
10580 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
10590 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  .        iCont =
105a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
105b0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
105c0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
105d0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
105e0 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
105f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10600 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
10610 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42  nd, unionTab, iB
10620 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69  reak);.        i
10630 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
10640 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
10650 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63  );.        selec
10660 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
10670 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
10680 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45   unionTab, p->pE
10690 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
106a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106b0 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65 73       0, -1, &des
106c0 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
106d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
106e0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
106f0 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
10700 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10710 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
10720 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
10730 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73  tart);.        s
10740 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
10750 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
10760 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10770 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10780 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
10790 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ab, 0);.      }.
107a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
107b0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
107c0 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20  NTERSECT: {.    
107d0 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
107e0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e  ;.      int iCon
107f0 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
10800 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
10810 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
10820 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
10830 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
10840 74 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b  t intersectdest;
10850 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a  .      int r1;..
10860 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45        /* INTERSE
10870 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  CT is different 
10880 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20  from the others 
10890 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65  since it require
108a0 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74  s.      ** two t
108b0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
108c0 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69    Hence it has i
108d0 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65  ts own case.  Be
108e0 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  gin.      ** by 
108f0 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74  allocating the t
10900 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65  ables we will ne
10910 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
10920 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65     tab1 = pParse
10930 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
10940 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
10950 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73  Tab++;.      ass
10960 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
10970 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64  ==0 );..      ad
10980 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
10990 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
109a0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31  nEphemeral, tab1
109b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
109c0 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
109d0 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[0] == -1 );.
109e0 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
109f0 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
10a00 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74  .      p->pRight
10a10 6d 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d 20 3d  most->usesEphm =
10a20 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
10a30 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a  ( p->pEList );..
10a40 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
10a50 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72  e SELECTs to our
10a60 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f   left into tempo
10a70 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31  rary table "tab1
10a80 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
10a90 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
10aa0 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65  estInit(&interse
10ab0 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f  ctdest, SRT_Unio
10ac0 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20  n, tab1);.      
10ad0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
10ae0 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
10af0 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73  r, &intersectdes
10b00 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  t, 0, 0, 0);.   
10b10 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10b20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
10b30 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
10b40 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
10b50 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
10b60 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
10b70 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
10b80 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
10b90 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
10ba0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10bb0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
10bc0 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab2, 0);.      a
10bd0 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
10be0 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20  enEphm[1] == -1 
10bf0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
10c00 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64  OpenEphm[1] = ad
10c10 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  dr;.      p->pPr
10c20 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
10c30 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
10c40 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
10c50 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
10c60 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
10c70 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
10c80 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
10c90 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 50  intersectdest.iP
10ca0 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20  arm = tab2;.    
10cb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
10cc0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
10cd0 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
10ce0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
10cf0 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
10d00 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
10d10 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
10d20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
10d30 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
10d40 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
10d50 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
10d60 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
10d70 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
10d80 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10d90 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
10da0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
10db0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
10dc0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
10dd0 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63  ake the intersec
10de0 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20  tion of the two 
10df0 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
10e00 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
10e10 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
10e20 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
10e30 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
10e40 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
10e50 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c  k ){.        Sel
10e60 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b  ect *pFirst = p;
10e70 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
10e80 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
10e90 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
10ea0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
10eb0 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
10ec0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
10ed0 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
10ee0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10ef0 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
10f00 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
10f10 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20  ;.      iCont = 
10f20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
10f30 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63  abel(v);.      c
10f40 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
10f50 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
10f60 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
10f70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10f80 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74  (v, OP_Rewind, t
10f90 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ab1, iBreak);.  
10fa0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
10fb0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
10fc0 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74  e);.      iStart
10fd0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
10fe0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65  dOp2(v, OP_RowKe
10ff0 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20  y, tab1, r1);.  
11000 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11010 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 46  ddOp3(v, OP_NotF
11020 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e  ound, tab2, iCon
11030 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  t, r1);.      sq
11040 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
11050 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
11060 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
11070 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
11080 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62  , p->pEList, tab
11090 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  1, p->pEList->nE
110a0 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
110b0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 2d 31             0, -1
110c0 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , &dest, iCont, 
110d0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
110e0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
110f0 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
11100 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11110 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11120 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61  Next, tab1, iSta
11130 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
11140 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
11150 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
11160 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11170 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
11180 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
11190 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
111a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
111b0 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  e, tab1, 0);.   
111c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
111d0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
111e0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
111f0 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20  ences used by . 
11200 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
11210 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69  bles needed to i
11220 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d  mplement the com
11230 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
11240 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65  ** Attach the Ke
11250 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
11260 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  to all temporary
11270 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
11280 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
11290 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69  is run by the ri
112a0 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  ght-most SELECT 
112b0 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a  statement only..
112c0 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
112d0 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65  ements to the le
112e0 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74  ft always skip t
112f0 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72  his part.  The r
11300 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53  ight-most.  ** S
11310 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f  ELECT might also
11320 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20   skip this part 
11330 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44  if it has no ORD
11340 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
11350 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61  .  ** no temp ta
11360 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65  bles are require
11370 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
11380 3e 75 73 65 73 45 70 68 6d 20 29 7b 0a 20 20 20  >usesEphm ){.   
11390 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
113b0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
113c0 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
113d0 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  KeyInfo;        
113e0 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
113f0 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
11400 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
11410 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f      Select *pLoo
11420 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
11430 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
11440 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20   through SELECT 
11450 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
11460 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f    CollSeq **apCo
11470 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
11480 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
11490 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d  hrough pKeyInfo-
114a0 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20  >aColl[] */.    
114b0 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
114c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
114d0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
114e0 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
114f0 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
11500 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d   p->pRightmost==
11510 70 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  p );.    nCol = 
11520 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
11530 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
11540 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
11550 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20  Zero(db,.       
11560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11570 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f  sizeof(*pKeyInfo
11580 29 2b 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43  )+nCol*(sizeof(C
11590 6f 6c 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a  ollSeq*) + 1));.
115a0 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66      if( !pKeyInf
115b0 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
115c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
115d0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
115e0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
115f0 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e  ..    pKeyInfo->
11600 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
11610 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69     pKeyInfo->nFi
11620 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20  eld = nCol;..   
11630 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c   for(i=0, apColl
11640 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  =pKeyInfo->aColl
11650 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61  ; i<nCol; i++, a
11660 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  pColl++){.      
11670 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53  *apColl = multiS
11680 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
11690 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
116a0 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c    if( 0==*apColl
116b0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43   ){.        *apC
116c0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
116d0 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
116e0 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f   }..    for(pLoo
116f0 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  p=p; pLoop; pLoo
11700 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29  p=pLoop->pPrior)
11710 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
11720 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
11730 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70      int addr = p
11740 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
11750 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hm[i];.        i
11760 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
11770 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d         /* If [0]
11780 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20   is unused then 
11790 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73  [1] is also unus
117a0 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20  ed.  So we can. 
117b0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61           ** alwa
117c0 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20  ys safely abort 
117d0 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66  as soon as the f
117e0 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74  irst unused slot
117f0 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20   is found */.   
11800 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
11810 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
11820 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20  hm[1]<0 );.     
11830 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11840 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
11850 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
11860 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29  2(v, addr, nCol)
11870 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11880 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
11890 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b   addr, (char*)pK
118a0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
118b0 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  FO);.        pLo
118c0 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
118d0 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  [i] = -1;.      
118e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
118f0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4b  te3DbFree(db, pK
11900 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75  eyInfo);.  }..mu
11910 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a  lti_select_end:.
11920 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20    pDest->iMem = 
11930 64 65 73 74 2e 69 4d 65 6d 3b 0a 20 20 70 44 65  dest.iMem;.  pDe
11940 73 74 2d 3e 6e 4d 65 6d 20 3d 20 64 65 73 74 2e  st->nMem = dest.
11950 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53  nMem;.  sqlite3S
11960 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
11970 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75  pDelete);.  retu
11980 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
11990 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
119a0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
119b0 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  /../*.** Code an
119c0 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
119d0 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69  ne for a corouti
119e0 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ne implementatio
119f0 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54  n of a.** SELECT
11a00 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   statment..**.**
11a10 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
11a20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69  output is contai
11a30 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 4d 65 6d  ned in pIn->iMem
11a40 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20  .  There are.** 
11a50 70 49 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c 75 6d 6e  pIn->nMem column
11a60 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20  s to be output. 
11a70 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20   pDest is where 
11a80 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c  the output shoul
11a90 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a  d.** be sent..**
11aa0 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73  .** regReturn is
11ab0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
11ac0 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  he register hold
11ad0 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69  ing the subrouti
11ae0 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64  ne.** return add
11af0 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  ress..**.** If r
11b00 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74  egPrev>0 then it
11b10 20 69 73 20 61 20 74 68 65 20 66 69 72 73 74 20   is a the first 
11b20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65  register in a ve
11b30 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63  ctor that.** rec
11b40 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  ords the previou
11b50 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72  s output.  mem[r
11b60 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61  egPrev] is a fla
11b70 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a  g that is false.
11b80 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20  ** if there has 
11b90 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73  been no previous
11ba0 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67   output.  If reg
11bb0 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65  Prev>0 then code
11bc0 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64   is.** generated
11bd0 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70   to suppress dup
11be0 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e  licates.  pKeyIn
11bf0 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63  fo is used for c
11c00 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73  omparing.** keys
11c10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c  ..**.** If the L
11c20 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d  IMIT found in p-
11c30 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68  >iLimit is reach
11c40 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ed, jump immedia
11c50 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61  tely to.** iBrea
11c60 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
11c70 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
11c80 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72  ubroutine(.  Par
11c90 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
11ca0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11cb0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
11cc0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
11cd0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
11ce0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
11cf0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49    SelectDest *pI
11d00 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72  n,        /* Cor
11d10 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67  outine supplying
11d20 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
11d30 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
11d40 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
11d50 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a  end the data */.
11d60 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c    int regReturn,
11d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11d80 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
11d90 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
11da0 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20  t regPrev,      
11db0 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
11dc0 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  s result registe
11dd0 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73  r.  No uniquenes
11de0 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49  s if 0 */.  KeyI
11df0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
11e00 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61      /* For compa
11e10 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f  ring with previo
11e20 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e  us entry */.  in
11e30 74 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20  t p4type,       
11e40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 34 20        /* The p4 
11e50 74 79 70 65 20 66 6f 72 20 70 4b 65 79 49 6e 66  type for pKeyInf
11e60 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  o */.  int iBrea
11e70 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
11e80 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
11e90 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
11ea0 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
11eb0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
11ec0 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
11ed0 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
11ee0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
11ef0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
11f00 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
11f10 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
11f20 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
11f30 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  Suppress duplica
11f40 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45  tes for UNION, E
11f50 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
11f60 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28  SECT .  */.  if(
11f70 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
11f80 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20  int j1, j2;.    
11f90 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
11fa0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
11fb0 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20  ot, regPrev);.  
11fc0 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64    j2 = sqlite3Vd
11fd0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
11fe0 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 4d 65  ompare, pIn->iMe
11ff0 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49  m, regPrev+1, pI
12000 6e 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20 20  n->nMem,.       
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12020 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
12030 65 79 49 6e 66 6f 2c 20 70 34 74 79 70 65 29 3b  eyInfo, p4type);
12040 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12050 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
12060 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e  p, j2+2, iContin
12070 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20 73  ue, j2+2);.    s
12080 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
12090 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73  re(v, j1);.    s
120a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
120b0 70 79 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  py(pParse, pIn->
120c0 69 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c  iMem, regPrev+1,
120d0 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20   pIn->nMem);.   
120e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
120f0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
12100 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 1, regPrev);. 
12110 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
12120 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
12130 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  d ) return 0;.. 
12140 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65   /* Suppress the
12150 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45   the first OFFSE
12160 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65  T entries if the
12170 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20  re is an OFFSET 
12180 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f  clause.  */.  co
12190 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69  deOffset(v, p, i
121a0 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77  Continue);..  sw
121b0 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65  itch( pDest->eDe
121c0 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f  st ){.    /* Sto
121d0 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
121e0 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
121f0 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
12200 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
12210 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
12220 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
12230 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
12240 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
12250 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
12260 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65  t r2 = sqlite3Ge
12270 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
12280 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12290 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
122a0 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d  MakeRecord, pIn-
122b0 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d  >iMem, pIn->nMem
122c0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
122d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
122e0 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70  , OP_NewRowid, p
122f0 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72 32 29  Dest->iParm, r2)
12300 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12310 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
12320 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69  Insert, pDest->i
12330 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20  Parm, r1, r2);. 
12340 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12350 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
12360 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
12370 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
12380 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
12390 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
123a0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
123b0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
123c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
123d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
123e0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
123f0 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
12400 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66  creating a set f
12410 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28  or an "expr IN (
12420 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e  SELECT ...)" con
12430 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74  struct,.    ** t
12440 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64  hen there should
12450 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65   be a single ite
12460 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
12470 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20   Write this.    
12480 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65  ** item into the
12490 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20   set table with 
124a0 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20  bogus data..    
124b0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
124c0 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Set: {.      int
124d0 20 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72   r1;.      asser
124e0 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20  t( pIn->nMem==1 
124f0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69  );.      p->affi
12500 6e 69 74 79 20 3d 20 0a 20 20 20 20 20 20 20 20  nity = .        
12510 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
12520 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73  ffinity(p->pELis
12530 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70  t->a[0].pExpr, p
12540 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b  Dest->affinity);
12550 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
12560 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
12570 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
12580 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
12590 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
125a0 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 2c 20 72   pIn->iMem, 1, r
125b0 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c  1, &p->affinity,
125c0 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
125d0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
125e0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
125f0 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 29 3b  , pIn->iMem, 1);
12600 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12610 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
12620 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  dxInsert, pDest-
12630 3e 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20  >iParm, r1);.   
12640 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
12650 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
12660 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
12670 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20  k;.    }..#if 0 
12680 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73   /* Never occurs
12690 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   on an ORDER BY 
126a0 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20  query */.    /* 
126b0 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74  If any row exist
126c0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
126d0 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20  et, record that 
126e0 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a  fact and abort..
126f0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
12700 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20  SRT_Exists: {.  
12710 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12720 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
12730 67 65 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69  ger, 1, pDest->i
12740 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Parm);.      /* 
12750 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
12760 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
12770 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
12780 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
12790 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
127a0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
127b0 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
127c0 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
127d0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
127e0 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
127f0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
12800 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
12810 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
12820 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
12830 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
12840 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
12850 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
12860 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
12870 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20  >nMem==1 );.    
12880 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
12890 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
128a0 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e  n->iMem, pDest->
128b0 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
128c0 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
128d0 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f  ause will jump o
128e0 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  ut of the loop f
128f0 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
12900 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
12910 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
12920 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
12930 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  RY */..    /* Se
12940 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  nd the data to t
12950 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  he callback func
12960 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75 62  tion or to a sub
12970 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68 65  routine.  In the
12980 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66 20  .    ** case of 
12990 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74 68  a subroutine, th
129a0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73  e subroutine its
129b0 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69 62  elf is responsib
129c0 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f  le for.    ** po
129d0 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 20 66  pping the data f
129e0 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20  rom the stack.. 
129f0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
12a00 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a  RT_Coroutine: {.
12a10 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74 2d        if( pDest-
12a20 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  >iMem==0 ){.    
12a30 20 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20      pDest->iMem 
12a40 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
12a50 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  Range(pParse, pI
12a60 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20  n->nMem);.      
12a70 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20    pDest->nMem = 
12a80 70 49 6e 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  pIn->nMem;.     
12a90 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
12aa0 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
12ab0 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  rse, pIn->iMem, 
12ac0 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 70 44 65  pDest->iMem, pDe
12ad0 73 74 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  st->nMem);.     
12ae0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12af0 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
12b00 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20  pDest->iParm);. 
12b10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12b20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  }..    case SRT_
12b30 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20  Callback: {.    
12b40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12b50 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
12b60 52 6f 77 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  Row, pIn->iMem, 
12b70 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  pIn->nMem);.    
12b80 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
12b90 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
12ba0 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d  (pParse, pIn->iM
12bb0 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a  em, pIn->nMem);.
12bc0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12bd0 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
12be0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
12bf0 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73  GGER).    /* Dis
12c00 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  card the results
12c10 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
12c20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
12c30 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20  ments inside.   
12c40 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20   ** the body of 
12c50 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20  a TRIGGER.  The 
12c60 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20  purpose of such 
12c70 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61  selects is to ca
12c80 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64  ll.    ** user-d
12c90 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
12ca0 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
12cb0 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
12cc0 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  not care.    ** 
12cd0 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c  about the actual
12ce0 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
12cf0 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  select..    */. 
12d00 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
12d10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12d20 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
12d30 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
12d40 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
12d50 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
12d60 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
12d70 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
12d80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12d90 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
12da0 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31  m, p->iLimit, -1
12db0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12dc0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
12dd0 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  fZero, p->iLimit
12de0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 0a  , iBreak);.  }..
12df0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
12e00 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
12e10 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  urn.  */.  sqlit
12e20 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
12e30 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29  el(v, iContinue)
12e40 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12e50 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
12e60 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a  rn, regReturn);.
12e70 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
12e80 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61  }../*.** Alterna
12e90 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65  tive compound se
12ea0 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61  lect code genera
12eb0 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77 68  tor for cases wh
12ec0 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  en there.** is a
12ed0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
12ee0 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75  e..**.** We assu
12ef0 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  me a query of th
12f00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
12f10 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65  :.**.**      <se
12f20 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f  lectA>  <operato
12f30 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f  r>  <selectB>  O
12f40 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79  RDER BY <orderby
12f50 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65  list>.**.** <ope
12f60 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66  rator> is one of
12f70 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f   UNION ALL, UNIO
12f80 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
12f90 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69 64  TERSECT.  The id
12fa0 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65  ea.** is to code
12fb0 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20   both <selectA> 
12fc0 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69  and <selectB> wi
12fd0 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
12fe0 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d  clause as.** co-
12ff0 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20  routines.  Then 
13000 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69  run the co-routi
13010 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20  nes in parallel 
13020 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65  and merge the re
13030 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68  sults.** into th
13040 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64  e output.  In ad
13050 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77  dition to the tw
13060 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61  o coroutines (ca
13070 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64  lled selectA and
13080 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65  .** selectB) the
13090 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75 74  re are 7 subrout
130a0 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f  ines:.**.**    o
130b0 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65  utA:    Move the
130c0 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73   output of the s
130d0 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65  electA coroutine
130e0 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
130f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
13100 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
13110 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  query..**.**    
13120 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68  outB:    Move th
13130 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
13140 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e  selectB coroutin
13150 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
13160 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
13170 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
13180 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67   query.  (Only g
13190 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49  enerated for UNI
131a0 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ON and.**       
131b0 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e        UNION ALL.
131c0 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53    EXCEPT and INS
131d0 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75  ERTSECT never ou
131e0 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a  tput a row that.
131f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 61  **             a
13200 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42  ppears only in B
13210 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42  .).**.**    AltB
13220 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
13230 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
13240 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
13250 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a  nes and A<B..**.
13260 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20 43  **    AeqB:    C
13270 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
13280 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
13290 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
132a0 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  d A==B..**.**   
132b0 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AgtB:    Called
132c0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
132d0 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
132e0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42  routines and A>B
132f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  ..**.**    EofA:
13300 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
13310 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
13320 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a  d from selectA..
13330 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20  **.**    EofB:  
13340 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61    Called when da
13350 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
13360 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a  from selectB..**
13370 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
13380 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61  tation of the la
13390 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f 75  tter five subrou
133a0 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20  tines depend on 
133b0 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61  which .** <opera
133c0 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a  tor> is used:.**
133d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
133e0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20     UNION ALL    
133f0 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20       UNION      
13400 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20 20        EXCEPT    
13410 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a        INTERSECT.
13420 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  **          ----
13430 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
13440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
13450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
13460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
13470 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74  **   AltB:   out
13480 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75  A, nextA      ou
13490 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
134a0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
134b0 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20      nextA.**.** 
134c0 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20    AeqB:   outA, 
134d0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65  nextA         ne
134e0 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20 20  xtA             
134f0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f 75  nextA         ou
13500 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20  tA, nextA.**.** 
13510 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20    AgtB:   outB, 
13520 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
13530 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
13540 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 20  nextB           
13550 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45   nextB.**.**   E
13560 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78  ofA:   outB, nex
13570 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65  tB      outB, ne
13580 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61 6c  xtB          hal
13590 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61  t             ha
135a0 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a  lt.**.**   EofB:
135b0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
135c0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
135d0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
135e0 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a  A         halt.*
135f0 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42  *.** In the AltB
13600 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42  , AeqB, and AgtB
13610 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e   subroutines, an
13620 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77   EOF on A follow
13630 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75  ing nextA.** cau
13640 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  ses an immediate
13650 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e   jump to EofA an
13660 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f  d an EOF on B fo
13670 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61  llowing nextB ca
13680 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64  uses.** an immed
13690 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
136a0 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20  B.  Within EofA 
136b0 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f  and EofB, and EO
136c0 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a  F on entry or.**
136d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58   following nextX
136e0 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74   causes a jump t
136f0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
13700 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69   select processi
13710 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63  ng..**.** Duplic
13720 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74  ate removal in t
13730 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  he UNION, EXCEPT
13740 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20  , and INTERSECT 
13750 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64  cases is handled
13760 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f  .** within the o
13770 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
13780 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20 72  .  The regPrev r
13790 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64  egister set hold
137a0 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  s the previously
137b0 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65  .** output value
137c0 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20  .  A comparison 
137d0 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20  is made against 
137e0 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74  this value and t
137f0 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20  he output.** is 
13800 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6e  skipped if the n
13810 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c  ext results woul
13820 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  d be the same as
13830 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a   the previous..*
13840 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
13850 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20  ntation plan is 
13860 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
13870 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
13880 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62  and seven.** sub
13890 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20  routines first, 
138a0 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e  then put the con
138b0 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68  trol logic at th
138c0 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20  e bottom.  Like 
138d0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
138e0 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a       goto Init.*
138f0 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75  *     coA: corou
13900 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75  tine for left qu
13910 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63  ery (A).**     c
13920 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oB: coroutine fo
13930 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28 42  r right query (B
13940 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75  ).**    outA: ou
13950 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  tput one row of 
13960 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75  A.**    outB: ou
13970 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  tput one row of 
13980 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49  B (UNION and UNI
13990 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20  ON ALL only).** 
139a0 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20     EofA: ....** 
139b0 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20     EofB: ....** 
139c0 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20     AltB: ....** 
139d0 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20     AeqB: ....** 
139e0 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20     AgtB: ....** 
139f0 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c     Init: initial
13a00 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65  ize coroutine re
13a10 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20  gisters.**      
13a20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a      yield coA.**
13a30 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66            if eof
13a40 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a  (A) goto EofA.**
13a50 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
13a60 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coB.**          
13a70 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45  if eof(B) goto E
13a80 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20  ofB.**    Cmpr: 
13a90 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20  Compare A, B.** 
13aa0 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c           Jump Al
13ab0 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a  tB, AeqB, AgtB.*
13ac0 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a  *     End: ....*
13ad0 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74  *.** We call Alt
13ae0 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45  B, AeqB, AgtB, E
13af0 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73  ofA, and EofB "s
13b00 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20  ubroutines" but 
13b10 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20  they are not.** 
13b20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20  actually called 
13b30 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20  using Gosub and 
13b40 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75  they do not Retu
13b50 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f  rn.  EofA and Eo
13b60 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c  fB loop.** until
13b70 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68   all data is exh
13b80 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70  austed then jump
13b90 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61   to the "end" la
13ba0 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c  be.  AltB, AeqB,
13bb0 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d  .** and AgtB jum
13bc0 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f  p to either L2 o
13bd0 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41  r to one of EofA
13be0 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66   or EofB..*/.#if
13bf0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13c00 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
13c10 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
13c20 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a  iSelectOrderBy(.
13c30 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
13c40 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
13c50 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
13c60 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
13c70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
13c80 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
13c90 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
13ca0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
13cb0 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
13cc0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
13cd0 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
13ce0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
13cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
13d00 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53   counters */.  S
13d10 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
13d20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
13d30 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
13d40 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
13d50 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
13d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
13d70 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
13d80 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c  is VDBE */.  Sel
13d90 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20 20  ectDest destA;  
13da0 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
13db0 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
13dc0 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  A */.  SelectDes
13dd0 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20  t destB;     /* 
13de0 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  Destination for 
13df0 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20  coroutine B */. 
13e00 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20   int regAddrA;  
13e10 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
13e20 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  s register for s
13e30 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e  elect-A coroutin
13e40 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f  e */.  int regEo
13e50 66 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fA;          /* 
13e60 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65  Flag to indicate
13e70 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 41 20 69   when select-A i
13e80 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20  s complete */.  
13e90 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20  int regAddrB;   
13ea0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
13eb0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
13ec0 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
13ed0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66   */.  int regEof
13ee0 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  B;          /* F
13ef0 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20  lag to indicate 
13f00 77 68 65 6e 20 73 65 6c 65 63 74 2d 42 20 69 73  when select-B is
13f10 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69   complete */.  i
13f20 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20  nt addrSelectA; 
13f30 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
13f40 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20  of the select-A 
13f50 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
13f60 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20  nt addrSelectB; 
13f70 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
13f80 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20  of the select-B 
13f90 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
13fa0 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20  nt regOutA;     
13fb0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
13fc0 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65  register for the
13fd0 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75   output-A subrou
13fe0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
13ff0 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20 20  gOutB;          
14000 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
14010 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70  ter for the outp
14020 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-B subroutine 
14030 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74  */.  int addrOut
14040 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
14050 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dress of the out
14060 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  put-A subroutine
14070 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
14080 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tB;         /* A
14090 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
140a0 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
140b0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  e */.  int addrE
140c0 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ofA;         /* 
140d0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
140e0 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65  elect-A-exhauste
140f0 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  d subroutine */.
14100 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20    int addrEofB; 
14110 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
14120 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
14130 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75 62  -B-exhausted sub
14140 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
14150 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20   addrAltB;      
14160 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
14170 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74   the A<B subrout
14180 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
14190 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f  rAeqB;         /
141a0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
141b0 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65   A==B subroutine
141c0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67   */.  int addrAg
141d0 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tB;         /* A
141e0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e  ddress of the A>
141f0 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
14200 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b    int regLimitA;
14210 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74          /* Limit
14220 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
14230 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20  lect-A */.  int 
14240 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20  regLimitB;      
14250 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73    /* Limit regis
14260 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
14270 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65   */.  int regPre
14280 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  v;          /* A
14290 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74   range of regist
142a0 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76  ers to hold prev
142b0 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20  ious output */. 
142c0 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b   int savedLimit;
142d0 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
142e0 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d  value of p->iLim
142f0 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65  it */.  int save
14300 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a  dOffset;      /*
14310 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20   Saved value of 
14320 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20  p->iOffset */.  
14330 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20  int labelCmpr;  
14340 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66        /* Label f
14350 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  or the start of 
14360 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69  the merge algori
14370 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  thm */.  int lab
14380 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f  elEnd;         /
14390 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  * Label for the 
143a0 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61  end of the overa
143b0 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a  ll SELECT stmt *
143c0 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20  /.  int j1;     
143d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
143e0 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74  p instructions t
143f0 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65 74  hat get retarget
14400 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ted */.  int op;
14410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14420 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c  * One of TK_ALL,
14430 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
14440 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45  CEPT, TK_INTERSE
14450 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  CT */.  KeyInfo 
14460 2a 70 4b 65 79 44 75 70 3b 20 20 20 20 20 2f 2a  *pKeyDup;     /*
14470 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f   Comparison info
14480 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c  rmation for dupl
14490 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f  icate removal */
144a0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
144b0 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70  Merge;   /* Comp
144c0 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  arison informati
144d0 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72  on for merging r
144e0 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ows */.  sqlite3
144f0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f   *db;          /
14500 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
14510 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c  ction */.  ExprL
14520 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
14530 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
14540 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
14550 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20   nOrderBy;      
14560 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
14570 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
14580 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
14590 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b    int *aPermute;
145a0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69          /* Mappi
145b0 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59  ng from ORDER BY
145c0 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74   terms to result
145d0 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a   set columns */.
145e0 20 20 75 38 20 4e 6f 74 55 73 65 64 3b 20 20 20    u8 NotUsed;   
145f0 20 20 20 20 20 20 20 20 2f 2a 20 44 75 6d 6d 79          /* Dummy
14600 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 0a 20   variables */.. 
14610 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
14620 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 64 62 20  erBy!=0 );.  db 
14630 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
14640 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
14650 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  e;.  if( v==0 ) 
14660 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
14670 4d 45 4d 3b 0a 20 20 6c 61 62 65 6c 45 6e 64 20  MEM;.  labelEnd 
14680 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
14690 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62  eLabel(v);.  lab
146a0 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33  elCmpr = sqlite3
146b0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
146c0 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75  ;...  /* Patch u
146d0 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  p the ORDER BY c
146e0 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20  lause.  */.  op 
146f0 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72  = p->op;  .  pPr
14700 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
14710 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
14720 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  r->pOrderBy==0 )
14730 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
14740 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73  ->pOrderBy;.  as
14750 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29  sert( pOrderBy )
14760 3b 0a 20 20 69 66 28 20 70 72 6f 63 65 73 73 43  ;.  if( processC
14770 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 70  ompoundOrderBy(p
14780 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
14790 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
147a0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6e 4f 72 64  RROR;.  }.  nOrd
147b0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  erBy = pOrderBy-
147c0 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f  >nExpr;..  /* Fo
147d0 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65  r operators othe
147e0 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c  r than UNION ALL
147f0 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65   we have to make
14800 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20   sure that.  ** 
14810 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
14820 75 73 65 20 63 6f 76 65 72 73 20 65 76 65 72 79  use covers every
14830 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73   term of the res
14840 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20  ult set.  Add.  
14850 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  ** terms to the 
14860 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
14870 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  as necessary..  
14880 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f  */.  if( op!=TK_
14890 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ALL ){.    for(i
148a0 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  =1; db->mallocFa
148b0 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d  iled==0 && i<=p-
148c0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  >pEList->nExpr; 
148d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  i++){.      for(
148e0 6a 3d 30 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b  j=0; j<nOrderBy;
148f0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45   j++){.        E
14900 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 4f 72  xpr *pTerm = pOr
14910 64 65 72 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70  derBy->a[j].pExp
14920 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  r;.        asser
14930 74 28 20 70 54 65 72 6d 2d 3e 6f 70 3d 3d 54 4b  t( pTerm->op==TK
14940 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20  _INTEGER );.    
14950 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
14960 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  rm->flags & EP_I
14970 6e 74 56 61 6c 75 65 29 21 3d 30 20 29 3b 0a 20  ntValue)!=0 );. 
14980 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
14990 2d 3e 69 54 61 62 6c 65 3d 3d 69 20 29 20 62 72  ->iTable==i ) br
149a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
149b0 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72     if( j==nOrder
149c0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  By ){.        Ex
149d0 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
149e0 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
149f0 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30  TK_INTEGER, 0, 0
14a00 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
14a10 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
14a20 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
14a30 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
14a40 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
14a50 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  lue;.        pNe
14a60 77 2d 3e 69 54 61 62 6c 65 20 3d 20 69 3b 0a 20  w->iTable = i;. 
14a70 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20         pOrderBy 
14a80 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
14a90 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
14aa0 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 2c 20  pOrderBy, pNew, 
14ab0 30 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 72 64  0);.        nOrd
14ac0 65 72 42 79 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  erBy++;.      }.
14ad0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14ae0 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
14af0 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69  arison permutati
14b00 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74  on and keyinfo t
14b10 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68  hat is used with
14b20 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74  .  ** the permut
14b30 61 74 69 6f 6e 20 69 6e 20 6f 72 64 65 72 20 74  ation in order t
14b40 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 74 6f  o comparisons to
14b50 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
14b60 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20  e next.  ** row 
14b70 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73  of results comes
14b80 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72   from selectA or
14b90 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20   selectB.  Also 
14ba0 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a  add explicit.  *
14bb0 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20  * collations to 
14bc0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
14bd0 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61  use terms so tha
14be0 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75  t when the subqu
14bf0 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68  eries.  ** to th
14c00 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20  e right and the 
14c10 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74  left are evaluat
14c20 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65  ed, they use the
14c30 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f   correct.  ** co
14c40 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  llation..  */.  
14c50 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74  aPermute = sqlit
14c60 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
14c70 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f  , sizeof(int)*nO
14c80 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61  rderBy);.  if( a
14c90 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 66  Permute ){.    f
14ca0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
14cb0 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
14cc0 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 4f  Expr *pTerm = pO
14cd0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
14ce0 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
14cf0 28 20 70 54 65 72 6d 2d 3e 6f 70 3d 3d 54 4b 5f  ( pTerm->op==TK_
14d00 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20  INTEGER );.     
14d10 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
14d20 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
14d30 61 6c 75 65 29 21 3d 30 20 29 3b 0a 20 20 20 20  alue)!=0 );.    
14d40 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20    aPermute[i] = 
14d50 70 54 65 72 6d 2d 3e 69 54 61 62 6c 65 2d 31 3b  pTerm->iTable-1;
14d60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
14d70 50 65 72 6d 75 74 65 5b 69 5d 3e 3d 30 20 26 26  Permute[i]>=0 &&
14d80 20 61 50 65 72 6d 75 74 65 5b 69 5d 3c 70 2d 3e   aPermute[i]<p->
14d90 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
14da0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d  .    }.    pKeyM
14db0 65 72 67 65 20 3d 0a 20 20 20 20 20 20 73 71 6c  erge =.      sql
14dc0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
14dd0 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79  db, sizeof(*pKey
14de0 4d 65 72 67 65 29 2b 6e 4f 72 64 65 72 42 79 2a  Merge)+nOrderBy*
14df0 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
14e00 29 2b 31 29 29 3b 0a 20 20 20 20 69 66 28 20 70  )+1));.    if( p
14e10 4b 65 79 4d 65 72 67 65 20 29 7b 0a 20 20 20 20  KeyMerge ){.    
14e20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f    pKeyMerge->aSo
14e30 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
14e40 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c  pKeyMerge->aColl
14e50 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20  [nOrderBy];.    
14e60 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 6e 46 69    pKeyMerge->nFi
14e70 65 6c 64 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a  eld = nOrderBy;.
14e80 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d        pKeyMerge-
14e90 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a  >enc = ENC(db);.
14ea0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
14eb0 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
14ec0 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
14ed0 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20   *pColl;.       
14ee0 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70   Expr *pTerm = p
14ef0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
14f00 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
14f10 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20   pTerm->flags & 
14f20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b  EP_ExpCollate ){
14f30 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
14f40 20 3d 20 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c 3b   = pTerm->pColl;
14f50 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
14f60 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
14f70 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
14f80 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
14f90 61 50 65 72 6d 75 74 65 5b 69 5d 29 3b 0a 20 20  aPermute[i]);.  
14fa0 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66          pTerm->f
14fb0 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f  lags |= EP_ExpCo
14fc0 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 20  llate;.         
14fd0 20 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c 20 3d 20   pTerm->pColl = 
14fe0 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d  pColl;.        }
14ff0 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72  .        pKeyMer
15000 67 65 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  ge->aColl[i] = p
15010 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4b  Coll;.        pK
15020 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72  eyMerge->aSortOr
15030 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42  der[i] = pOrderB
15040 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
15050 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
15060 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b  .  }else{.    pK
15070 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d  eyMerge = 0;.  }
15080 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20  ..  /* Reattach 
15090 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
150a0 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79  use to the query
150b0 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ..  */.  p->pOrd
150c0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
150d0 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  .  pPrior->pOrde
150e0 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
150f0 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d  rListDup(pParse-
15100 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  >db, pOrderBy);.
15110 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
15120 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72   range of tempor
15130 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e  ary registers an
15140 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65  d the KeyInfo ne
15150 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68  eded.  ** for th
15160 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d  e logic that rem
15170 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72  oves duplicate r
15180 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20  esult rows when 
15190 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  the.  ** operato
151a0 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45  r is UNION, EXCE
151b0 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
151c0 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20   (but not UNION 
151d0 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALL)..  */.  if(
151e0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
151f0 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a     regPrev = 0;.
15200 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
15210 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   nExpr = p->pELi
15220 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
15230 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
15240 3d 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 72 65  =nExpr );.    re
15250 67 50 72 65 76 20 3d 20 73 71 6c 69 74 65 33 47  gPrev = sqlite3G
15260 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
15270 73 65 2c 20 6e 45 78 70 72 2b 31 29 3b 0a 20 20  se, nExpr+1);.  
15280 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15290 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
152a0 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 0, regPrev);.
152b0 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71      pKeyDup = sq
152c0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
152d0 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  o(db,.          
152e0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
152f0 70 4b 65 79 44 75 70 29 20 2b 20 6e 45 78 70 72  pKeyDup) + nExpr
15300 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
15310 2a 29 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28  *)+1) );.    if(
15320 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20   pKeyDup ){.    
15330 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74    pKeyDup->aSort
15340 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 4b  Order = (u8*)&pK
15350 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 6e 45 78  eyDup->aColl[nEx
15360 70 72 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 44  pr];.      pKeyD
15370 75 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78  up->nField = nEx
15380 70 72 3b 0a 20 20 20 20 20 20 70 4b 65 79 44 75  pr;.      pKeyDu
15390 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  p->enc = ENC(db)
153a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
153b0 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a   i<nExpr; i++){.
153c0 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d          pKeyDup-
153d0 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74  >aColl[i] = mult
153e0 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
153f0 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
15400 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
15410 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30  SortOrder[i] = 0
15420 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15430 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72    }. .  /* Separ
15440 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64  ate the left and
15450 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72 79   the right query
15460 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65   from one anothe
15470 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69  r.  */.  p->pPri
15480 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72  or = 0;.  pPrior
15490 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30  ->pRightmost = 0
154a0 3b 0a 20 20 70 72 6f 63 65 73 73 4f 72 64 65 72  ;.  processOrder
154b0 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
154c0 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
154d0 31 2c 20 26 4e 6f 74 55 73 65 64 29 3b 0a 20 20  1, &NotUsed);.  
154e0 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69  if( pPrior->pPri
154f0 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 70 72 6f  or==0 ){.    pro
15500 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79  cessOrderGroupBy
15510 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
15520 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
15530 79 2c 20 31 2c 20 26 4e 6f 74 55 73 65 64 29 3b  y, 1, &NotUsed);
15540 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
15550 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  te the limit reg
15560 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70  isters */.  comp
15570 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
15580 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62  s(pParse, p, lab
15590 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d  elEnd);.  if( p-
155a0 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54  >iLimit && op==T
155b0 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67  K_ALL ){.    reg
155c0 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73  LimitA = ++pPars
155d0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
155e0 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73  LimitB = ++pPars
155f0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
15600 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15610 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f  , OP_Copy, p->iO
15620 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73  ffset ? p->iOffs
15630 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74  et+1 : p->iLimit
15640 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15660 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a      regLimitA);.
15670 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15680 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
15690 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67  , regLimitA, reg
156a0 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65  LimitB);.  }else
156b0 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20  {.    regLimitA 
156c0 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b  = regLimitB = 0;
156d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
156e0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
156f0 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c  pLimit);.  p->pL
15700 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  imit = 0;.  sqli
15710 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
15720 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20  , p->pOffset);. 
15730 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
15740 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b  ..  regAddrA = +
15750 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
15760 20 72 65 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61   regEofA = ++pPa
15770 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
15780 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65  AddrB = ++pParse
15790 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66  ->nMem;.  regEof
157a0 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
157b0 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20  em;.  regOutA = 
157c0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
157d0 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50    regOutB = ++pP
157e0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
157f0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
15800 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f  nit(&destA, SRT_
15810 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
15820 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  drA);.  sqlite3S
15830 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
15840 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estB, SRT_Corout
15850 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  ine, regAddrB);.
15860 0a 20 20 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20  .  /* Jump past 
15870 74 68 65 20 76 61 72 69 6f 75 73 20 73 75 62 72  the various subr
15880 6f 75 74 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f  outines and coro
15890 75 74 69 6e 65 73 20 74 6f 20 74 68 65 20 6d 61  utines to the ma
158a0 69 6e 0a 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f  in.  ** merge lo
158b0 6f 70 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73  op.  */.  j1 = s
158c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
158d0 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
158e0 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71  addrSelectA = sq
158f0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
15900 41 64 64 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20  Addr(v);...  /* 
15910 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
15920 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
15930 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
15940 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a  ement to the.  *
15950 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f  * left of the co
15960 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20  mpound operator 
15970 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74  - the "A" select
15980 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ..  */.  VdbeNoo
15990 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65  pComment((v, "Be
159a0 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  gin coroutine fo
159b0 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29  r left SELECT"))
159c0 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  ;.  pPrior->iLim
159d0 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a  it = regLimitA;.
159e0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
159f0 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
15a00 26 64 65 73 74 41 2c 20 30 2c 20 30 2c 20 30 29  &destA, 0, 0, 0)
15a10 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
15a20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
15a30 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 41 29  ger, 1, regEofA)
15a40 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
15a50 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
15a60 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  d, regAddrA);.  
15a70 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
15a80 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69  (v, "End corouti
15a90 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45  ne for left SELE
15aa0 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  CT"));..  /* Gen
15ab0 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
15ac0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
15ad0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
15ae0 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20  nt on .  ** the 
15af0 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22 20  right - the "B" 
15b00 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64  select.  */.  ad
15b10 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69  drSelectB = sqli
15b20 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
15b30 64 72 28 76 29 3b 0a 20 20 56 64 62 65 4e 6f 6f  dr(v);.  VdbeNoo
15b40 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65  pComment((v, "Be
15b50 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  gin coroutine fo
15b60 72 20 72 69 67 68 74 20 53 45 4c 45 43 54 22 29  r right SELECT")
15b70 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20  );.  savedLimit 
15b80 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73  = p->iLimit;.  s
15b90 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e  avedOffset = p->
15ba0 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c  iOffset;.  p->iL
15bb0 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42  imit = regLimitB
15bc0 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
15bd0 20 30 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 53   0;  .  sqlite3S
15be0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
15bf0 20 26 64 65 73 74 42 2c 20 30 2c 20 30 2c 20 30   &destB, 0, 0, 0
15c00 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  );.  p->iLimit =
15c10 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70   savedLimit;.  p
15c20 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65  ->iOffset = save
15c30 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74  dOffset;.  sqlit
15c40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15c50 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
15c60 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74  egEofB);.  sqlit
15c70 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
15c80 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
15c90 72 42 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43  rB);.  VdbeNoopC
15ca0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20  omment((v, "End 
15cb0 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
15cc0 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a  ght SELECT"));..
15cd0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
15ce0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
15cf0 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
15d00 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41  ent row of the A
15d10 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
15d20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
15d30 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
15d40 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
15d50 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
15d60 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
15d70 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b  outine for A"));
15d80 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65  .  addrOutA = ge
15d90 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
15da0 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
15db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dc0 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74  p, &destA, pDest
15dd0 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20  , regOutA,.     
15de0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
15df0 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50 34  rev, pKeyDup, P4
15e00 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
15e10 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a  , labelEnd);.  .
15e20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
15e30 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
15e40 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
15e50 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42  ent row of the B
15e60 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
15e70 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
15e80 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
15e90 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
15ea0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
15eb0 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
15ec0 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  N ){.    VdbeNoo
15ed0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
15ee0 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
15ef0 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f   B"));.    addrO
15f00 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utB = generateOu
15f10 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
15f20 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
15f30 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
15f40 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  B, pDest, regOut
15f50 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  B,.             
15f60 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
15f70 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  yDup, P4_KEYINFO
15f80 5f 53 54 41 54 49 43 2c 20 6c 61 62 65 6c 45 6e  _STATIC, labelEn
15f90 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  d);.  }..  /* Ge
15fa0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
15fb0 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
15fc0 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
15fd0 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61   select A.  ** a
15fe0 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
15ff0 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
16000 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a  lect B remains..
16010 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
16020 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
16030 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  A subroutine"));
16040 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58  .  if( op==TK_EX
16050 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  CEPT || op==TK_I
16060 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
16070 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74  addrEofA = sqlit
16080 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16090 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
160a0 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 20  lEnd);.  }else{ 
160b0 20 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d   .    addrEofA =
160c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
160d0 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
160e0 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  EofB, labelEnd);
160f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16100 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
16110 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
16120 72 4f 75 74 42 29 3b 0a 20 20 20 20 73 71 6c 69  rOutB);.    sqli
16130 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
16140 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
16150 64 72 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  drB);.    sqlite
16160 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16170 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45  P_Goto, 0, addrE
16180 6f 66 41 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ofA);.  }..  /* 
16190 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
161a0 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
161b0 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
161c0 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a  om select B.  **
161d0 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
161e0 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
161f0 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73  select A remains
16200 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
16210 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
16220 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
16230 61 64 64 72 45 6f 66 41 3b 0a 20 20 7d 65 6c 73  addrEofA;.  }els
16240 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f  e{  .    VdbeNoo
16250 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
16260 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-B subroutine")
16270 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  );.    addrEofB 
16280 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
16290 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
162a0 67 45 6f 66 41 2c 20 6c 61 62 65 6c 45 6e 64 29  gEofA, labelEnd)
162b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
162c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
162d0 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64  sub, regOutA, ad
162e0 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c  drOutA);.    sql
162f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16300 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
16310 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddrA);.    sqlit
16320 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16330 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
16340 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  EofB);.  }..  /*
16350 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
16360 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
16370 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20  e of A<B.  */.  
16380 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
16390 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72  (v, "A-lt-B subr
163a0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
163b0 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAltB = sqlite3V
163c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
163d0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20  Gosub, regOutA, 
163e0 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c  addrOutA);.  sql
163f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16400 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
16410 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
16420 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16430 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64  _If, regEofA, ad
16440 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74  drEofA);.  sqlit
16450 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16460 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
16470 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65  lCmpr);..  /* Ge
16480 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
16490 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
164a0 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66  f A==B.  */.  if
164b0 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op==TK_ALL ){.
164c0 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61      addrAeqB = a
164d0 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65  ddrAltB;.  }else
164e0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45   if( op==TK_INTE
164f0 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
16500 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42  rAeqB = addrAltB
16510 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b  ;.    addrAltB++
16520 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56  ;.  }else{.    V
16530 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
16540 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f  v, "A-eq-B subro
16550 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
16560 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c  drAeqB =.    sql
16570 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16580 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
16590 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddrA);.    sqlit
165a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
165b0 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20  OP_If, regEofA, 
165c0 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 73  addrEofA);.    s
165d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
165e0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
165f0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a  labelCmpr);.  }.
16600 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
16610 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
16620 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20  e case of A>B.  
16630 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
16640 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42  ment((v, "A-gt-B
16650 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
16660 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c    addrAgtB = sql
16670 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
16680 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70  ddr(v);.  if( op
16690 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d  ==TK_ALL || op==
166a0 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
166b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
166c0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
166d0 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
166e0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
166f0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
16700 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
16710 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16720 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
16730 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f   regEofB, addrEo
16740 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fB);.  sqlite3Vd
16750 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
16760 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
16770 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63  r);..  /* This c
16780 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f  ode runs once to
16790 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72   initialize ever
167a0 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73  ything..  */.  s
167b0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
167c0 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c  re(v, j1);.  sql
167d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
167e0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
167f0 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c   regEofA);.  sql
16800 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16810 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
16820 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c   regEofB);.  sql
16830 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16840 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 41  , OP_Gosub, regA
16850 64 64 72 41 2c 20 61 64 64 72 53 65 6c 65 63 74  ddrA, addrSelect
16860 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
16870 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
16880 73 75 62 2c 20 72 65 67 41 64 64 72 42 2c 20 61  sub, regAddrB, a
16890 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 73  ddrSelectB);.  s
168a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
168b0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
168c0 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20  fA, addrEofA);. 
168d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
168e0 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
168f0 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b  EofB, addrEofB);
16900 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74  ..  /* Implement
16910 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20   the main merge 
16920 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
16930 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
16940 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72  bel(v, labelCmpr
16950 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16960 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72  AddOp4(v, OP_Per
16970 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20  mutation, 0, 0, 
16980 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75  0, (char*)aPermu
16990 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29  te, P4_INTARRAY)
169a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
169b0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
169c0 61 72 65 2c 20 64 65 73 74 41 2e 69 4d 65 6d 2c  are, destA.iMem,
169d0 20 64 65 73 74 42 2e 69 4d 65 6d 2c 20 6e 4f 72   destB.iMem, nOr
169e0 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
169f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a00 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65  (char*)pKeyMerge
16a10 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
16a20 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74 65 33  DOFF);.  sqlite3
16a30 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16a40 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c  _Jump, addrAltB,
16a50 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41   addrAeqB, addrA
16a60 67 74 42 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65  gtB);..  /* Rele
16a70 61 73 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65  ase temporary re
16a80 67 69 73 74 65 72 73 0a 20 20 2a 2f 0a 20 20 69  gisters.  */.  i
16a90 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20  f( regPrev ){.  
16aa0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
16ab0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
16ac0 2c 20 72 65 67 50 72 65 76 2c 20 6e 4f 72 64 65  , regPrev, nOrde
16ad0 72 42 79 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rBy+1);.  }..  /
16ae0 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68  * Jump to the th
16af0 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65  is point in orde
16b00 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  r to terminate t
16b10 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
16b20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
16b30 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
16b40 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  lEnd);..  /* Set
16b50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
16b60 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20  utput columns.  
16b70 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  */.  if( pDest->
16b80 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
16b90 61 63 6b 20 29 7b 0a 20 20 20 20 53 65 6c 65 63  ack ){.    Selec
16ba0 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69  t *pFirst = pPri
16bb0 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  or;.    while( p
16bc0 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
16bd0 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
16be0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e  >pPrior;.    gen
16bf0 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
16c00 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
16c10 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st->pEList);.  }
16c20 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c  ..  /* Reassembl
16c30 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  y the compound q
16c40 75 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20  uery so that it 
16c50 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f  will be freed co
16c60 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20  rrectly.  ** by 
16c70 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
16c80 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  tion */.  if( p-
16c90 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73  >pPrior ){.    s
16ca0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
16cb0 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  te(db, p->pPrior
16cc0 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69  );.  }.  p->pPri
16cd0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 0a 20 20  or = pPrior;..  
16ce0 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72  /*** TBD:  Inser
16cf0 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c  t subroutine cal
16d00 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73  ls to close curs
16d10 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74  ors on incomplet
16d20 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72  e.  **** subquer
16d30 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 72 65 74 75  ies ****/.  retu
16d40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
16d50 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
16d60 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
16d70 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
16d80 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
16d90 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77  IT_VIEW)./* Forw
16da0 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73  ard Declarations
16db0 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
16dc0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 73 71  substExprList(sq
16dd0 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74  lite3*, ExprList
16de0 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
16df0 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  *);.static void 
16e00 73 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69  substSelect(sqli
16e10 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20  te3*, Select *, 
16e20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29  int, ExprList *)
16e30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  ;../*.** Scan th
16e40 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73  rough the expres
16e50 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70  sion pExpr.  Rep
16e60 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72  lace every refer
16e70 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c  ence to.** a col
16e80 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d  umn in table num
16e90 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20  ber iTable with 
16ea0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43  a copy of the iC
16eb0 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72  olumn-th.** entr
16ec0 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42  y in pEList.  (B
16ed0 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e  ut leave referen
16ee0 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44  ces to the ROWID
16ef0 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68   column .** unch
16f00 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  anged.).**.** Th
16f10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61  is routine is pa
16f20 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65  rt of the flatte
16f30 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20  ning procedure. 
16f40 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77   A subquery.** w
16f50 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20  hose result set 
16f60 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45  is defined by pE
16f70 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20  List appears as 
16f80 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20  entry in the.** 
16f90 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
16fa0 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61   SELECT such tha
16fb0 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f  t the VDBE curso
16fc0 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  r assigned to th
16fd0 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73  at.** FORM claus
16fe0 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c  e entry is iTabl
16ff0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
17000 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73   make the necess
17010 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  ary .** changes 
17020 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74  to pExpr so that
17030 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63   it refers direc
17040 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63  tly to the sourc
17050 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68  e table.** of th
17060 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65  e subquery rathe
17070 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
17080 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
17090 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
170a0 20 73 75 62 73 74 45 78 70 72 28 0a 20 20 73 71   substExpr(.  sq
170b0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
170c0 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
170d0 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69  oc errors to thi
170e0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  s connection */.
170f0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
17100 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e        /* Expr in
17110 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74   which substitut
17120 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20  ion occurs */.  
17130 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
17140 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
17150 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a  be substituted *
17160 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
17170 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74  List    /* Subst
17180 69 74 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e  itute expression
17190 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45  s */.){.  if( pE
171a0 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
171b0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
171c0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
171d0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Expr->iTable==iT
171e0 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20  able ){.    if( 
171f0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
17200 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
17210 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
17220 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17230 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Expr *pNew;.    
17240 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
17250 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43  !=0 && pExpr->iC
17260 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45  olumn<pEList->nE
17270 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  xpr );.      ass
17280 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
17290 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
172a0 52 69 67 68 74 3d 3d 30 20 26 26 20 70 45 78 70  Right==0 && pExp
172b0 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  r->pList==0 );. 
172c0 20 20 20 20 20 70 4e 65 77 20 3d 20 70 45 4c 69       pNew = pELi
172d0 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f  st->a[pExpr->iCo
172e0 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20  lumn].pExpr;.   
172f0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21     assert( pNew!
17300 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
17310 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70  r->op = pNew->op
17320 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17330 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
17340 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
17350 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
17360 78 70 72 44 75 70 28 64 62 2c 20 70 4e 65 77 2d  xprDup(db, pNew-
17370 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61  >pLeft);.      a
17380 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52  ssert( pExpr->pR
17390 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
173a0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
173b0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
173c0 64 62 2c 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  db, pNew->pRight
173d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
173e0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
173f0 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
17400 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  >pList = sqlite3
17410 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
17420 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  pNew->pList);.  
17430 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
17440 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65  e = pNew->iTable
17450 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
17460 54 61 62 20 3d 20 70 4e 65 77 2d 3e 70 54 61 62  Tab = pNew->pTab
17470 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
17480 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69  Column = pNew->i
17490 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45  Column;.      pE
174a0 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77  xpr->iAgg = pNew
174b0 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73 71  ->iAgg;.      sq
174c0 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64  lite3TokenCopy(d
174d0 62 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  b, &pExpr->token
174e0 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b  , &pNew->token);
174f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f  .      sqlite3To
17500 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 45 78  kenCopy(db, &pEx
17510 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d  pr->span, &pNew-
17520 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 70 45  >span);.      pE
17530 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  xpr->pSelect = s
17540 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
17550 64 62 2c 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63  db, pNew->pSelec
17560 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  t);.      pExpr-
17570 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 66  >flags = pNew->f
17580 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  lags;.    }.  }e
17590 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78  lse{.    substEx
175a0 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c  pr(db, pExpr->pL
175b0 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  eft, iTable, pEL
175c0 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
175d0 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  xpr(db, pExpr->p
175e0 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70  Right, iTable, p
175f0 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
17600 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70  tSelect(db, pExp
17610 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  r->pSelect, iTab
17620 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
17630 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
17640 62 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c  b, pExpr->pList,
17650 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
17660 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
17670 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
17680 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
17690 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  ,         /* Rep
176a0 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
176b0 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72  s here */.  Expr
176c0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
176d0 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e   /* List to scan
176e0 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f   and in which to
176f0 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 65   make substitute
17700 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  s */.  int iTabl
17710 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
17720 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74  able to be subst
17730 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  ituted */.  Expr
17740 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
17750 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76   /* Substitute v
17760 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  alues */.){.  in
17770 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
17780 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
17790 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
177a0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
177b0 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c     substExpr(db,
177c0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
177d0 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  pr, iTable, pELi
177e0 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  st);.  }.}.stati
177f0 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65  c void substSele
17800 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ct(.  sqlite3 *d
17810 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  b,         /* Re
17820 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
17830 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c  rs here */.  Sel
17840 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
17850 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74    /* SELECT stat
17860 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74  ement in which t
17870 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
17880 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  ions */.  int iT
17890 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
178a0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65  * Table to be re
178b0 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72  placed */.  Expr
178c0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
178d0 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76   /* Substitute v
178e0 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  alues */.){.  if
178f0 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !p ) return;. 
17900 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
17910 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54  b, p->pEList, iT
17920 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
17930 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
17940 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  b, p->pGroupBy, 
17950 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
17960 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
17970 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
17980 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
17990 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 64  );.  substExpr(d
179a0 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69  b, p->pHaving, i
179b0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
179c0 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20    substExpr(db, 
179d0 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c  p->pWhere, iTabl
179e0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
179f0 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d  bstSelect(db, p-
17a00 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c  >pPrior, iTable,
17a10 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23 65 6e 64   pEList);.}.#end
17a20 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
17a30 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
17a40 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
17a50 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
17a60 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  W) */..#if !defi
17a70 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
17a80 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
17a90 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
17aa0 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68  T_VIEW)./*.** Th
17ab0 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
17ac0 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73  pts to flatten s
17ad0 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64  ubqueries in ord
17ae0 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65  er to speed.** e
17af0 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65  xecution.  It re
17b00 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61  turns 1 if it ma
17b10 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20  kes changes and 
17b20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69  0 if no flatteni
17b30 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a  ng.** occurs..**
17b40 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e  .** To understan
17b50 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66  d the concept of
17b60 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e   flattening, con
17b70 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
17b80 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a  ing.** query:.**
17b90 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
17ba0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b   FROM (SELECT x+
17bb0 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
17bc0 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52  HERE z<100) WHER
17bd0 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E a>5.**.** The 
17be0 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69  default way of i
17bf0 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73  mplementing this
17c00 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65   query is to exe
17c10 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71  cute the.** subq
17c20 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73  uery first and s
17c30 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
17c40 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
17c50 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72  table, then.** r
17c60 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  un the outer que
17c70 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  ry on that tempo
17c80 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69  rary table.  Thi
17c90 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a  s requires two.*
17ca0 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68  * passes over th
17cb0 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72  e data.  Further
17cc0 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68  more, because th
17cd0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
17ce0 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69  e.** has no indi
17cf0 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63  ces, the WHERE c
17d00 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74  lause on the out
17d10 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  er query cannot 
17d20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e  be.** optimized.
17d30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
17d40 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
17d50 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20  rewrite queries 
17d60 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76  such as the abov
17d70 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  e into.** a sing
17d80 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20  le flat select, 
17d90 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
17da0 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20       SELECT x+y 
17db0 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
17dc0 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35  RE z<100 AND a>5
17dd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
17de0 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
17df0 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e  is simpification
17e00 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20   gives the same 
17e10 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e  result.** but on
17e20 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74  ly has to scan t
17e30 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41  he data once.  A
17e40 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63  nd because indic
17e50 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69  es might .** exi
17e60 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  st on the table 
17e70 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73  t1, a complete s
17e80 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20  can of the data 
17e90 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69  might be.** avoi
17ea0 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74  ded..**.** Flatt
17eb0 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74  ening is only at
17ec0 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f  tempted if all o
17ed0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
17ee0 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
17ef0 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75    (1)  The subqu
17f00 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
17f10 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
17f20 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74  oth use aggregat
17f30 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  es..**.**   (2) 
17f40 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
17f50 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
17f60 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  e or the outer q
17f70 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
17f80 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20  in..**.**   (3) 
17f90 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
17fa0 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f   not the right o
17fb0 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
17fc0 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20   outer join.**  
17fd0 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c        (Originall
17fe0 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20 20  y ticket #306.  
17ff0 53 74 72 65 6e 67 68 74 65 6e 65 64 20 62 79 20  Strenghtened by 
18000 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a  ticket #3300).**
18010 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
18020 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
18030 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f  ISTINCT or the o
18040 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
18050 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
18060 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75    (5)  The subqu
18070 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
18080 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  NCT or the outer
18090 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
180a0 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
180b0 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
180c0 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75    (6)  The subqu
180d0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
180e0 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
180f0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
18100 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
18110 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
18120 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
18130 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63  ery has a FROM c
18140 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  lause..**.**   (
18150 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  8)  The subquery
18160 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
18170 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
18180 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
18190 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
181a0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
181b0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
181c0 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
181d0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
181e0 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
181f0 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
18200 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65  (10)  The subque
18210 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
18220 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
18230 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
18240 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
18250 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
18260 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62  *  (11)  The sub
18270 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
18280 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
18290 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
182a0 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
182b0 2a 2a 20 20 28 31 32 29 20 20 4e 6f 74 20 69 6d  **  (12)  Not im
182c0 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73  plemented.  Subs
182d0 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69  umed into restri
182e0 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20  ction (3).  Was 
182f0 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20  previously.**   
18300 20 20 20 20 20 61 20 73 65 70 61 72 61 74 65 20       a separate 
18310 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69  restriction deri
18320 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74  ving from ticket
18330 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31   #350..**.**  (1
18340 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
18350 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79   and outer query
18360 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
18370 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20 28 31   LIMIT.**.**  (1
18380 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
18390 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46   does not use OF
183a0 46 53 45 54 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29  FSET.**.**  (15)
183b0 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
183c0 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  y is not part of
183d0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
183e0 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20  ct or the.**    
183f0 20 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65      subquery doe
18400 73 20 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20  s not have both 
18410 61 6e 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20  an ORDER BY and 
18420 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a  a LIMIT clause..
18430 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74  **        (See t
18440 69 63 6b 65 74 20 23 32 33 33 39 29 0a 2a 2a 0a  icket #2339).**.
18450 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f 75  **  (16)  The ou
18460 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
18470 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
18480 20 74 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   the subquery do
18490 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74  es.**        not
184a0 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42   contain ORDER B
184b0 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39 34  Y.  (Ticket #294
184c0 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74 6f  2)  This used to
184d0 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20   not matter.**  
184e0 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69        until we i
184f0 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67 72  ntroduced the gr
18500 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e  oup_concat() fun
18510 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20  ction.  .**.**  
18520 28 31 37 29 20 20 54 68 65 20 73 75 62 2d 71 75  (17)  The sub-qu
18530 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d  ery is not a com
18540 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72  pound select, or
18550 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e 20 41   it is a UNION A
18560 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  LL .**        co
18570 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d 61  mpound clause ma
18580 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79 20 6f  de up entirely o
18590 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  f non-aggregate 
185a0 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a  queries, and .**
185b0 20 20 20 20 20 20 20 20 74 68 65 20 70 61 72 65          the pare
185c0 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  nt query:.**.** 
185d0 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f           * is no
185e0 74 20 69 74 73 65 6c 66 20 70 61 72 74 20 6f 66  t itself part of
185f0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
18600 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ct,.**          
18610 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  * is not an aggr
18620 65 67 61 74 65 20 6f 72 20 44 49 53 54 49 4e 43  egate or DISTINC
18630 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20  T query, and.** 
18640 20 20 20 20 20 20 20 20 20 2a 20 68 61 73 20 6e           * has n
18650 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 6f  o other tables o
18660 72 20 73 75 62 2d 73 65 6c 65 63 74 73 20 69 6e  r sub-selects in
18670 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
18680 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54  ..**.**        T
18690 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75  he parent and su
186a0 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74  b-query may cont
186b0 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65  ain WHERE clause
186c0 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a  s. Subject to.**
186d0 20 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31          rules (1
186e0 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34  1), (13) and (14
186f0 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f  ), they may also
18700 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42   contain ORDER B
18710 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d  Y,.**        LIM
18720 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c  IT and OFFSET cl
18730 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  auses..**.**  (1
18740 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71  8)  If the sub-q
18750 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
18760 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
18770 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
18780 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52  .**        ORDER
18790 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68   by clause of th
187a0 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65  e parent must be
187b0 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63   simple referenc
187c0 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20  es to .**       
187d0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
187e0 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  sub-query..**.**
187f0 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   In this routine
18800 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65  , the "p" parame
18810 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
18820 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
18830 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71  ery..** The subq
18840 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d  uery is p->pSrc-
18850 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67  >a[iFrom].  isAg
18860 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
18870 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20   outer query.** 
18880 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20  uses aggregates 
18890 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67  and subqueryIsAg
188a0 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
188b0 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
188c0 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
188d0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
188e0 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
188f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
18900 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74   a no-op and ret
18910 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c  urns 0..** If fl
18920 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65  attening is atte
18930 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69  mpted this routi
18940 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a  ne returns 1..**
18950 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65  .** All of the e
18960 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
18970 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e  is must occur on
18980 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20   both the outer 
18990 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65  query and.** the
189a0 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65   subquery before
189b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
189c0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
189d0 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  t flattenSubquer
189e0 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
189f0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
18a00 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
18a10 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
18a20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
18a30 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
18a40 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
18a50 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
18a60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
18a70 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
18a80 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
18a90 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
18aa0 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20   isAgg,         
18ab0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
18ac0 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
18ad0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
18ae0 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71  ns */.  int subq
18af0 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20  ueryIsAgg    /* 
18b00 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  True if the subq
18b10 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
18b20 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
18b30 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
18b40 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
18b50 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
18b60 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65  uthContext;.  Se
18b70 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20  lect *pParent;. 
18b80 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20   Select *pSub;  
18b90 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65       /* The inne
18ba0 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71  r query or "subq
18bb0 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63  uery" */.  Selec
18bc0 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f  t *pSub1;      /
18bd0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
18be0 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63   rightmost selec
18bf0 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a  t in sub-query *
18c00 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
18c10 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  c;      /* The F
18c20 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
18c30 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
18c40 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62  .  SrcList *pSub
18c50 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52  Src;   /* The FR
18c60 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
18c70 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45   subquery */.  E
18c80 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20  xprList *pList; 
18c90 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
18ca0 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65   set of the oute
18cb0 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  r query */.  int
18cc0 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20   iParent;       
18cd0 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
18ce0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53  number of the pS
18cf0 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65  ub result set te
18d00 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  mp table */.  in
18d10 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
18d20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
18d30 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  r */.  Expr *pWh
18d40 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ere;            
18d50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
18d60 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
18d70 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
18d80 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20  item *pSubitem; 
18d90 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
18da0 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
18db0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
18dc0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
18dd0 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e  see if flattenin
18de0 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
18df0 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
18e00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d  ..  */.  if( p==
18e10 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
18e20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
18e30 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
18e40 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
18e50 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
18e60 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26  ;.  pSubitem = &
18e70 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a  pSrc->a[iFrom];.
18e80 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62    iParent = pSub
18e90 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  item->iCursor;. 
18ea0 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d   pSub = pSubitem
18eb0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ->pSelect;.  ass
18ec0 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
18ed0 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73    if( isAgg && s
18ee0 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72  ubqueryIsAgg ) r
18ef0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
18f00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
18f10 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a  riction (1)  */.
18f20 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
18f30 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72  Agg && pSrc->nSr
18f40 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  c>1 ) return 0; 
18f50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
18f60 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a  riction (2)  */.
18f70 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
18f80 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
18f90 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f  ( pSubSrc );.  /
18fa0 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69  * Prior to versi
18fb0 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c  on 3.1.2, when L
18fc0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
18fd0 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65  had to be simple
18fe0 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a   constants,.  **
18ff0 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65   not arbitrary e
19000 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65 20  xpresssions, we 
19010 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d  allowed some com
19020 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20  bining of LIMIT 
19030 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
19040 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75  because they cou
19050 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61  ld be computed a
19060 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
19070 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20   But when LIMIT 
19080 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
19090 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79  became arbitrary
190a0 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
190b0 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20   were forced to 
190c0 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73  add restrictions
190d0 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28   (13).  ** and (
190e0 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53  14). */.  if( pS
190f0 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
19100 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
19110 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
19120 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
19130 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (13) */.  if( pS
19140 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65  ub->pOffset ) re
19150 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19170 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
19180 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d  (14) */.  if( p-
19190 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26 20 70  >pRightmost && p
191a0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
191b0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
191c0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
191d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
19200 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f  triction (15) */
19210 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53  .  }.  if( pSubS
19220 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65  rc->nSrc==0 ) re
19230 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
19240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19250 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29   Restriction (7)
19260 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62    */.  if( (pSub
19270 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20  ->isDistinct || 
19280 70 53 75 62 2d 3e 70 4c 69 6d 69 74 29 20 0a 20  pSub->pLimit) . 
19290 20 20 20 20 20 20 20 20 26 26 20 28 70 53 72 63          && (pSrc
192a0 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67  ->nSrc>1 || isAg
192b0 67 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f  g) ){          /
192c0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28  * Restrictions (
192d0 34 29 28 35 29 28 38 29 28 39 29 20 2a 2f 0a 20  4)(5)(8)(9) */. 
192e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
192f0 20 20 20 20 0a 20 20 7d 0a 20 20 69 66 28 20 70      .  }.  if( p
19300 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20  ->isDistinct && 
19310 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20  subqueryIsAgg ) 
19320 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
19330 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
19340 20 28 36 29 20 20 2a 2f 0a 20 20 69 66 28 20 28   (6)  */.  if( (
19350 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72  p->disallowOrder
19360 42 79 20 7c 7c 20 70 2d 3e 70 4f 72 64 65 72 42  By || p->pOrderB
19370 79 29 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  y) && pSub->pOrd
19380 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74  erBy ){.     ret
19390 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
193a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193c0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
193d0 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (11) */.  }.  if
193e0 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d  ( isAgg && pSub-
193f0 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
19400 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
19410 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
19420 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 0a 20 20 2f  ion (16) */..  /
19430 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45  * OBSOLETE COMME
19440 4e 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72  NT 1:.  ** Restr
19450 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68  iction 3:  If th
19460 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20  e subquery is a 
19470 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
19480 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
19490 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61  .  ** not used a
194a0 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
194b0 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20  and of an outer 
194c0 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20  join.  Examples 
194d0 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a  of why this.  **
194e0 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a   is not allowed:
194f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
19500 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
19510 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74   JOIN (t2 JOIN t
19520 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  3).  **.  ** If 
19530 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
19540 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
19550 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
19560 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
19570 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49  TER JOIN t2) JOI
19580 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  N t3.  **.  ** w
19590 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61  hich is not at a
195a0 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  ll the same thin
195b0 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53  g..  **.  ** OBS
195c0 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a  OLETE COMMENT 2:
195d0 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f  .  ** Restrictio
195e0 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75  n 12:  If the su
195f0 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69  bquery is the ri
19600 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
19610 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a   left outer.  **
19620 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
19630 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
19640 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
19650 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70  e..  ** An examp
19660 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20  les of why this 
19670 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
19680 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
19690 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
196a0 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  JOIN (SELECT * F
196b0 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e  ROM t2 WHERE t2.
196c0 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  x>0).  **.  ** I
196d0 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
196e0 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
196f0 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
19700 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
19710 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57  OUTER JOIN t2) W
19720 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a  HERE t2.x>0.  **
19730 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32  .  ** But the t2
19740 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61  .x>0 test will a
19750 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20  lways fail on a 
19760 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20  NULL row of t2, 
19770 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63  which.  ** effec
19780 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20  tively converts 
19790 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69  the OUTER JOIN i
197a0 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49  nto an INNER JOI
197b0 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49  N..  **.  ** THI
197c0 53 20 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f  S OVERRIDES OBSO
197d0 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20  LETE COMMENTS 1 
197e0 41 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a  AND 2 ABOVE:.  *
197f0 2a 20 54 69 63 6b 65 74 20 23 33 33 30 30 20 73  * Ticket #3300 s
19800 68 6f 77 73 20 74 68 61 74 20 66 6c 61 74 74 65  hows that flatte
19810 6e 69 6e 67 20 74 68 65 20 72 69 67 68 74 20 74  ning the right t
19820 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  erm of a LEFT JO
19830 49 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67  IN.  ** is fraug
19840 68 74 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20  ht with danger. 
19850 20 42 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74   Best to avoid t
19860 68 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20  he whole thing. 
19870 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62   If the.  ** sub
19880 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
19890 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
198a0 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20  T JOIN, then do 
198b0 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a  not flatten..  *
198c0 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65  /.  if( (pSubite
198d0 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
198e0 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20  _OUTER)!=0 ){.  
198f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
19900 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
19910 6e 20 31 37 3a 20 49 66 20 74 68 65 20 73 75 62  n 17: If the sub
19920 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
19930 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65  ound SELECT, the
19940 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75  n it must.  ** u
19950 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f  se only the UNIO
19960 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20  N ALL operator. 
19970 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  And none of the 
19980 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75  simple select qu
19990 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  eries.  ** that 
199a0 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70  make up the comp
199b0 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20  ound SELECT are 
199c0 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67  allowed to be ag
199d0 67 72 65 67 61 74 65 20 6f 72 20 64 69 73 74 69  gregate or disti
199e0 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73  nct.  ** queries
199f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ..  */.  if( pSu
19a00 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  b->pPrior ){.   
19a10 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 7c   if( p->pPrior |
19a20 7c 20 69 73 41 67 67 20 7c 7c 20 70 2d 3e 69 73  | isAgg || p->is
19a30 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 72 63  Distinct || pSrc
19a40 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20  ->nSrc!=1 ){.   
19a50 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
19a60 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31   }.    for(pSub1
19a70 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53  =pSub; pSub1; pS
19a80 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f  ub1=pSub1->pPrio
19a90 72 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53  r){.      if( pS
19aa0 75 62 31 2d 3e 69 73 41 67 67 20 7c 7c 20 70 53  ub1->isAgg || pS
19ab0 75 62 31 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  ub1->isDistinct 
19ac0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62  .       || (pSub
19ad0 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75  1->pPrior && pSu
19ae0 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  b1->op!=TK_ALL) 
19af0 0a 20 20 20 20 20 20 20 7c 7c 20 21 70 53 75 62  .       || !pSub
19b00 31 2d 3e 70 53 72 63 20 7c 7c 20 70 53 75 62 31  1->pSrc || pSub1
19b10 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 0a  ->pSrc->nSrc!=1.
19b20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
19b30 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
19b40 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
19b50 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e   Restriction 18.
19b60 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
19b70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
19b80 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66   int ii;.      f
19b90 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70  or(ii=0; ii<p->p
19ba0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
19bb0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45  ii++){.        E
19bc0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 2d 3e  xpr *pExpr = p->
19bd0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e  pOrderBy->a[ii].
19be0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
19bf0 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
19c00 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72  _COLUMN || pExpr
19c10 2d 3e 69 54 61 62 6c 65 21 3d 69 50 61 72 65 6e  ->iTable!=iParen
19c20 74 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  t ){ .          
19c30 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
19c40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
19c50 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 72 73 65 2d  }.  }..  pParse-
19c60 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
19c70 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b  pSubitem->zName;
19c80 0a 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  .  sqlite3AuthCh
19c90 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
19ca0 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
19cb0 20 30 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a   0);.  pParse->z
19cc0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
19cd0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
19ce0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75  ..  /* If the su
19cf0 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
19d00 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
19d10 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 69 74 20  tement, then it 
19d20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 61 20 55  must be.  ** a U
19d30 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65  NION ALL and the
19d40 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75   parent query mu
19d50 73 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  st be of the for
19d60 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  m:.  **.  **    
19d70 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69   SELECT <expr-li
19d80 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71  st> FROM (<sub-q
19d90 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c  uery>) <where-cl
19da0 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ause> .  **.  **
19db0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79   followed by any
19dc0 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
19dd0 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63   and/or OFFSET c
19de0 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f  lauses. This blo
19df0 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20  ck.  ** creates 
19e00 4e 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  N copies of the 
19e10 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74  parent query wit
19e20 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42  hout any ORDER B
19e30 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a  Y, LIMIT or .  *
19e40 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  * OFFSET clauses
19e50 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20   and joins them 
19e60 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  to the left-hand
19e70 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69  -side of the ori
19e80 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67  ginal.  ** using
19e90 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
19ea0 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  tors. In this ca
19eb0 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  se N is the numb
19ec0 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a  er of simple.  *
19ed0 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  * select stateme
19ee0 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f  nts in the compo
19ef0 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20  und sub-query.. 
19f00 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70   */.  for(pSub=p
19f10 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75  Sub->pPrior; pSu
19f20 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  b; pSub=pSub->pP
19f30 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63  rior){.    Selec
19f40 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70  t *pNew;.    Exp
19f50 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
19f60 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
19f70 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20     Expr *pLimit 
19f80 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
19f90 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d   Expr *pOffset =
19fa0 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
19fb0 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20   Select *pPrior 
19fc0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
19fd0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
19fe0 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
19ff0 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  0;.    p->pPrior
1a000 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69   = 0;.    p->pLi
1a010 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  mit = 0;.    pNe
1a020 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  w = sqlite3Selec
1a030 74 44 75 70 28 64 62 2c 20 70 29 3b 0a 20 20 20  tDup(db, p);.   
1a040 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
1a050 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70  pPrior;.    p->p
1a060 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20  Prior = pNew;.  
1a070 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
1a080 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d  pOrderBy;.    p-
1a090 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20  >op = TK_ALL;.  
1a0a0 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
1a0b0 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20  ;.    p->pLimit 
1a0c0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d  = pLimit;.    p-
1a0d0 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
1a0e0 65 74 3b 0a 20 20 20 20 70 2d 3e 70 52 69 67 68  et;.    p->pRigh
1a0f0 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 70  tmost = 0;.    p
1a100 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  New->pRightmost 
1a110 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
1a120 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
1a130 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
1a140 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
1a150 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68 65 0a  rmitted for the.
1a160 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e    ** iFrom-th en
1a170 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
1a180 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75  clause in the ou
1a190 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  ter query..  */.
1a1a0 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d    pSub = pSub1 =
1a1b0 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
1a1c0 63 74 3b 0a 20 20 66 6f 72 28 70 50 61 72 65 6e  ct;.  for(pParen
1a1d0 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50  t=p; pParent; pP
1a1e0 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70  arent=pParent->p
1a1f0 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62  Prior, pSub=pSub
1a200 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69  ->pPrior){.    i
1a210 6e 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75  nt nSubSrc = pSu
1a220 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20  bSrc->nSrc;.    
1a230 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30  int jointype = 0
1a240 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d 20  ;.    pSubSrc = 
1a250 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 20 20  pSub->pSrc;.    
1a260 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e  pSrc = pParent->
1a270 70 53 72 63 3b 0a 0a 20 20 20 20 2f 2a 20 4d 6f  pSrc;..    /* Mo
1a280 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52  ve all of the FR
1a290 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  OM elements of t
1a2a0 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
1a2b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
1a2c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1a2d0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
1a2e0 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68   Before doing th
1a2f0 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 20  is, remember.   
1a300 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e   ** the cursor n
1a310 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72  umber for the or
1a320 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65  iginal outer que
1a330 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20  ry FROM element 
1a340 69 6e 0a 20 20 20 20 2a 2a 20 69 50 61 72 65 6e  in.    ** iParen
1a350 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20  t.  The iParent 
1a360 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65  cursor will neve
1a370 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73  r be used.  Subs
1a380 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 20 20  equent code.    
1a390 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70  ** will scan exp
1a3a0 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67  ressions looking
1a3b0 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66   for iParent ref
1a3c0 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c  erences and repl
1a3d0 61 63 65 0a 20 20 20 20 2a 2a 20 74 68 6f 73 65  ace.    ** those
1a3e0 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68   references with
1a3f0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a400 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  t resolve to the
1a410 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20   subquery FROM. 
1a420 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77     ** elements w
1a430 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
1a440 67 20 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  g in..    */.   
1a450 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20   if( pSrc ){.   
1a460 20 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70     pSubitem = &p
1a470 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20  Src->a[iFrom];. 
1a480 20 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70       nSubSrc = p
1a490 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20  SubSrc->nSrc;.  
1a4a0 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70      jointype = p
1a4b0 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  Subitem->jointyp
1a4c0 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
1a4d0 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53 75 62  DeleteTable(pSub
1a4e0 69 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  item->pTab);.   
1a4f0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1a500 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
1a510 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20  Database);.     
1a520 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1a530 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  b, pSubitem->zNa
1a540 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
1a550 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
1a560 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  bitem->zAlias);.
1a570 20 20 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e        pSubitem->
1a580 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
1a590 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
1a5a0 61 73 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ase = 0;.      p
1a5b0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  Subitem->zName =
1a5c0 20 30 3b 0a 20 20 20 20 20 20 70 53 75 62 69 74   0;.      pSubit
1a5d0 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a  em->zAlias = 0;.
1a5e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53      }.    if( nS
1a5f0 75 62 53 72 63 21 3d 31 20 7c 7c 20 21 70 53 72  ubSrc!=1 || !pSr
1a600 63 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  c ){.      int e
1a610 78 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d  xtra = nSubSrc -
1a620 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   1;.      for(i=
1a630 28 70 53 72 63 3f 31 3a 30 29 3b 20 69 3c 6e 53  (pSrc?1:0); i<nS
1a640 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubSrc; i++){.   
1a650 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69       pSrc = sqli
1a660 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1a670 28 64 62 2c 20 70 53 72 63 2c 20 30 2c 20 30 29  (db, pSrc, 0, 0)
1a680 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
1a690 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc==0 ){.       
1a6a0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63     pParent->pSrc
1a6b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1a6c0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
1a6d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1a6e0 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20    pParent->pSrc 
1a6f0 3d 20 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f  = pSrc;.      fo
1a700 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31  r(i=pSrc->nSrc-1
1a710 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d  ; i-extra>=iFrom
1a720 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  ; i--){.        
1a730 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72  pSrc->a[i] = pSr
1a740 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20  c->a[i-extra];. 
1a750 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a760 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
1a770 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
1a780 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
1a790 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  ] = pSubSrc->a[i
1a7a0 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ];.      memset(
1a7b0 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20  &pSubSrc->a[i], 
1a7c0 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72  0, sizeof(pSubSr
1a7d0 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d  c->a[i]));.    }
1a7e0 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72  .    pSrc->a[iFr
1a7f0 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a  om].jointype = j
1a800 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20  ointype;.  .    
1a810 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62  /* Now begin sub
1a820 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65  stituting subque
1a830 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78  ry result set ex
1a840 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20  pressions for . 
1a850 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73     ** references
1a860 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20   to the iParent 
1a870 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1a880 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20  ry..    ** .    
1a890 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20  ** Example:.    
1a8a0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45  **.    **   SELE
1a8b0 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f  CT a+5, b*10 FRO
1a8c0 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53  M (SELECT x*3 AS
1a8d0 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52   a, y+10 AS b FR
1a8e0 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62  OM t1) WHERE a>b
1a8f0 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20  ;.    **   \    
1a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a910 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20   \_____________ 
1a920 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  subquery _______
1a930 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a  ___/          /.
1a940 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f      **    \_____
1a950 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1a960 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
1a970 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1a980 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20  ___________/.   
1a990 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f   **.    ** We lo
1a9a0 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72  ok at every expr
1a9b0 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75  ession in the ou
1a9c0 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76  ter query and ev
1a9d0 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
1a9e0 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73  .    ** "a" we s
1a9f0 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20  ubstitute "x*3" 
1aa00 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
1aa10 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75  we see "b" we su
1aa20 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e  bstitute "y+10".
1aa30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73  .    */.    pLis
1aa40 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c  t = pParent->pEL
1aa50 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ist;.    for(i=0
1aa60 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
1aa70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
1aa80 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 20  pr *pExpr;.     
1aa90 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   if( pList->a[i]
1aaa0 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45  .zName==0 && (pE
1aab0 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
1aac0 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a  ].pExpr)->span.z
1aad0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
1aae0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1aaf0 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   = .            
1ab00 20 20 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e     sqlite3DbStrN
1ab10 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
1ab20 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45  Expr->span.z, pE
1ab30 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20  xpr->span.n);.  
1ab40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1ab50 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1ab60 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73  , pParent->pELis
1ab70 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  t, iParent, pSub
1ab80 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69  ->pEList);.    i
1ab90 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
1aba0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1abb0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47 72  db, pParent->pGr
1abc0 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  oupBy, iParent, 
1abd0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1abe0 20 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64       substExpr(d
1abf0 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  b, pParent->pHav
1ac00 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ing, iParent, pS
1ac10 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
1ac20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d   }.    if( pSub-
1ac30 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
1ac40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
1ac50 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  nt->pOrderBy==0 
1ac60 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1ac70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75  ->pOrderBy = pSu
1ac80 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  b->pOrderBy;.   
1ac90 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42     pSub->pOrderB
1aca0 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  y = 0;.    }else
1acb0 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f   if( pParent->pO
1acc0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
1acd0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1ace0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65  , pParent->pOrde
1acf0 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  rBy, iParent, pS
1ad00 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
1ad10 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d   }.    if( pSub-
1ad20 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20  >pWhere ){.     
1ad30 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   pWhere = sqlite
1ad40 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75  3ExprDup(db, pSu
1ad50 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  b->pWhere);.    
1ad60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 68  }else{.      pWh
1ad70 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ere = 0;.    }. 
1ad80 20 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49     if( subqueryI
1ad90 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73  sAgg ){.      as
1ada0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1adb0 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20  Having==0 );.   
1adc0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
1add0 69 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  ing = pParent->p
1ade0 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61  Where;.      pPa
1adf0 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70  rent->pWhere = p
1ae00 57 68 65 72 65 3b 0a 20 20 20 20 20 20 73 75 62  Where;.      sub
1ae10 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
1ae20 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  nt->pHaving, iPa
1ae30 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1ae40 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
1ae50 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  nt->pHaving = sq
1ae60 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
1ae70 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1ae80 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
1ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1aeb0 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
1aec0 48 61 76 69 6e 67 29 29 3b 0a 20 20 20 20 20 20  Having));.      
1aed0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
1aee0 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
1aef0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1af00 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
1af10 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
1af20 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29   pSub->pGroupBy)
1af30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1af40 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c     substExpr(db,
1af50 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
1af60 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
1af70 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
1af80 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
1af90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
1afa0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  (db, pParent->pW
1afb0 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20  here, pWhere);. 
1afc0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54     }.  .    /* T
1afd0 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65  he flattened que
1afe0 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69  ry is distinct i
1aff0 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e  f either the inn
1b000 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  er or the.    **
1b010 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1b020 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a  distinct. .    *
1b030 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 69  /.    pParent->i
1b040 73 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  sDistinct = pPar
1b050 65 6e 74 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  ent->isDistinct 
1b060 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69  || pSub->isDisti
1b070 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20  nct;.  .    /*. 
1b080 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e     ** SELECT ...
1b090 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
1b0a0 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54  . LIMIT a OFFSET
1b0b0 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53   b) LIMIT x OFFS
1b0c0 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ET y;.    **.   
1b0d0 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74   ** One is tempt
1b0e0 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64  ed to try to add
1b0f0 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62   a and b to comb
1b100 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20  ine the limits. 
1b110 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a   But this.    **
1b120 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69   does not work i
1b130 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69  f either limit i
1b140 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20  s negative..    
1b150 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
1b160 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >pLimit ){.     
1b170 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74   pParent->pLimit
1b180 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b   = pSub->pLimit;
1b190 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69  .      pSub->pLi
1b1a0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  mit = 0;.    }. 
1b1b0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c   }..  /* Finiall
1b1c0 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
1b1d0 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
1b1e0 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
1b1f0 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
1b200 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
1b210 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1b220 53 75 62 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Sub1);..  return
1b230 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
1b240 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1b250 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1b260 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1b270 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
1b280 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
1b290 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1b2a0 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ent passed as an
1b2b0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65   argument to see
1b2c0 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 6d   if it.** is a m
1b2d0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75  in() or max() qu
1b2e0 65 72 79 2e 20 52 65 74 75 72 6e 20 57 48 45 52  ery. Return WHER
1b2f0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72  E_ORDERBY_MIN or
1b300 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
1b310 41 58 20 69 66 20 0a 2a 2a 20 69 74 20 69 73 2c  AX if .** it is,
1b320 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e   or 0 otherwise.
1b330 20 41 74 20 70 72 65 73 65 6e 74 2c 20 61 20 71   At present, a q
1b340 75 65 72 79 20 69 73 20 63 6f 6e 73 69 64 65 72  uery is consider
1b350 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 6d 69  ed to be.** a mi
1b360 6e 28 29 2f 6d 61 78 28 29 20 71 75 65 72 79 20  n()/max() query 
1b370 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54  if:.**.**   1. T
1b380 68 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65  here is a single
1b390 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 46   object in the F
1b3a0 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
1b3b0 2a 20 20 20 32 2e 20 54 68 65 72 65 20 69 73 20  *   2. There is 
1b3c0 61 20 73 69 6e 67 6c 65 20 65 78 70 72 65 73 73  a single express
1b3d0 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ion in the resul
1b3e0 74 20 73 65 74 2c 20 61 6e 64 20 69 74 20 69 73  t set, and it is
1b3f0 0a 2a 2a 20 20 20 20 20 20 65 69 74 68 65 72 20  .**      either 
1b400 6d 69 6e 28 78 29 20 6f 72 20 6d 61 78 28 78 29  min(x) or max(x)
1b410 2c 20 77 68 65 72 65 20 78 20 69 73 20 61 20 63  , where x is a c
1b420 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 2e  olumn reference.
1b430 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1b440 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73 65  inMaxQuery(Parse
1b450 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
1b460 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 45   *p){.  Expr *pE
1b470 78 70 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  xpr;.  ExprList 
1b480 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c  *pEList = p->pEL
1b490 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 4c 69  ist;..  if( pELi
1b4a0 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
1b4b0 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45  eturn WHERE_ORDE
1b4c0 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45  RBY_NORMAL;.  pE
1b4d0 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  xpr = pEList->a[
1b4e0 30 5d 2e 70 45 78 70 72 3b 0a 20 20 70 45 4c 69  0].pExpr;.  pELi
1b4f0 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
1b500 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  t;.  if( pExpr->
1b510 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
1b520 49 4f 4e 20 7c 7c 20 70 45 4c 69 73 74 3d 3d 30  ION || pEList==0
1b530 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   || pEList->nExp
1b540 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
1b550 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61  .  if( pEList->a
1b560 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54  [0].pExpr->op!=T
1b570 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 20 72  K_AGG_COLUMN ) r
1b580 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45  eturn WHERE_ORDE
1b590 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66  RBY_NORMAL;.  if
1b5a0 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  ( pExpr->token.n
1b5b0 21 3d 33 20 29 20 72 65 74 75 72 6e 20 57 48 45  !=3 ) return WHE
1b5c0 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
1b5d0 4c 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  L;.  if( sqlite3
1b5e0 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
1b5f0 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
1b600 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  min",3)==0 ){.  
1b610 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f    return WHERE_O
1b620 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65  RDERBY_MIN;.  }e
1b630 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
1b640 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70  trNICmp((char*)p
1b650 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d  Expr->token.z,"m
1b660 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20  ax",3)==0 ){.   
1b670 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52   return WHERE_OR
1b680 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 7d 0a 20  DERBY_MAX;.  }. 
1b690 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52   return WHERE_OR
1b6a0 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a  DERBY_NORMAL;.}.
1b6b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1b6c0 69 6e 65 20 72 65 73 6f 6c 76 65 73 20 61 6e 79  ine resolves any
1b6d0 20 6e 61 6d 65 73 20 75 73 65 64 20 69 6e 20 74   names used in t
1b6e0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
1b6f0 20 74 68 65 0a 2a 2a 20 73 75 70 70 6c 69 65 64   the.** supplied
1b700 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1b710 74 2e 20 49 66 20 74 68 65 20 53 45 4c 45 43 54  t. If the SELECT
1b720 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
1b730 20 72 65 73 6f 6c 76 65 64 0a 2a 2a 20 69 73 20   resolved.** is 
1b740 61 20 73 75 62 2d 73 65 6c 65 63 74 2c 20 74 68  a sub-select, th
1b750 65 6e 20 70 4f 75 74 65 72 4e 43 20 69 73 20 61  en pOuterNC is a
1b760 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1b770 4e 61 6d 65 43 6f 6e 74 65 78 74 20 0a 2a 2a 20  NameContext .** 
1b780 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 53 45  of the parent SE
1b790 4c 45 43 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  LECT..*/.int sql
1b7a0 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
1b7b0 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
1b7c0 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
1b7d0 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
1b7e0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
1b7f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1b800 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
1b810 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
1b820 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  d. */.  NameCont
1b830 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f  ext *pOuterNC  /
1b840 2a 20 54 68 65 20 6f 75 74 65 72 20 6e 61 6d 65  * The outer name
1b850 20 63 6f 6e 74 65 78 74 2e 20 4d 61 79 20 62 65   context. May be
1b860 20 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45   NULL. */.){.  E
1b870 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
1b880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1b890 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e  ult set. */.  in
1b8a0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1b8b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 2d           /* For-
1b8c0 6c 6f 6f 70 20 76 61 72 69 61 62 6c 65 20 75 73  loop variable us
1b8d0 65 64 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70  ed in multiple p
1b8e0 6c 61 63 65 73 20 2a 2f 0a 20 20 4e 61 6d 65 43  laces */.  NameC
1b8f0 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20  ontext sNC;     
1b900 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e        /* Local n
1b910 61 6d 65 2d 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ame-context */. 
1b920 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
1b930 70 42 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBy;        /* T
1b940 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75  he group by clau
1b950 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  se */..  /* If t
1b960 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
1b970 72 75 6e 20 62 65 66 6f 72 65 2c 20 72 65 74 75  run before, retu
1b980 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  rn immediately. 
1b990 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65  */.  if( p->isRe
1b9a0 73 6f 6c 76 65 64 20 29 7b 0a 20 20 20 20 61 73  solved ){.    as
1b9b0 73 65 72 74 28 20 21 70 4f 75 74 65 72 4e 43 20  sert( !pOuterNC 
1b9c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1b9d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
1b9e0 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 3d 20 31  ->isResolved = 1
1b9f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
1ba00 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
1ba10 65 6e 20 65 72 72 6f 72 73 2c 20 64 6f 20 6e 6f  en errors, do no
1ba20 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20  thing. */.  if( 
1ba30 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
1ba40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1ba50 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
1ba60 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65    /* Prepare the
1ba70 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
1ba80 74 2e 20 54 68 69 73 20 63 61 6c 6c 20 77 69 6c  t. This call wil
1ba90 6c 20 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 63  l allocate all c
1baa0 75 72 73 6f 72 73 0a 20 20 2a 2a 20 72 65 71 75  ursors.  ** requ
1bab0 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74  ired to handle t
1bac0 68 65 20 74 61 62 6c 65 73 20 61 6e 64 20 73 75  he tables and su
1bad0 62 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  bqueries in the 
1bae0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a  FROM clause..  *
1baf0 2f 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65  /.  if( prepSele
1bb00 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70  ctStmt(pParse, p
1bb10 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1bb20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1bb30 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  }..  /* Resolve 
1bb40 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
1bb50 69 6e 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  in the LIMIT and
1bb60 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
1bb70 20 54 68 65 73 65 0a 20 20 2a 2a 20 61 72 65 20   These.  ** are 
1bb80 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72  not allowed to r
1bb90 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 61 6d 65  efer to any name
1bba0 73 2c 20 73 6f 20 70 61 73 73 20 61 6e 20 65 6d  s, so pass an em
1bbb0 70 74 79 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e  pty NameContext.
1bbc0 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
1bbd0 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
1bbe0 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 50 61 72  NC));.  sNC.pPar
1bbf0 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69  se = pParse;.  i
1bc00 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
1bc10 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c  solveNames(&sNC,
1bc20 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a 20   p->pLimit) ||. 
1bc30 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1bc40 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
1bc50 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 20 29  C, p->pOffset) )
1bc60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1bc70 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
1bc80 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
1bc90 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65  local name-conte
1bca0 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20 45 78  xt to pass to Ex
1bcb0 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29  prResolveNames()
1bcc0 20 74 6f 0a 20 20 2a 2a 20 72 65 73 6f 6c 76 65   to.  ** resolve
1bcd0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2d   the expression-
1bce0 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43  list..  */.  sNC
1bcf0 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20  .allowAgg = 1;. 
1bd00 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
1bd10 70 2d 3e 70 53 72 63 3b 0a 20 20 73 4e 43 2e 70  p->pSrc;.  sNC.p
1bd20 4e 65 78 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b  Next = pOuterNC;
1bd30 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e  ..  /* Resolve n
1bd40 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65 73 75  ames in the resu
1bd50 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 70 45 4c  lt set. */.  pEL
1bd60 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
1bd70 0a 20 20 69 66 28 20 21 70 45 4c 69 73 74 20 29  .  if( !pEList )
1bd80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1bd90 52 52 4f 52 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  RROR;.  for(i=0;
1bda0 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
1bdb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
1bdc0 20 2a 70 58 20 3d 20 70 45 4c 69 73 74 2d 3e 61   *pX = pEList->a
1bdd0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
1bde0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
1bdf0 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c  solveNames(&sNC,
1be00 20 70 58 29 20 29 7b 0a 20 20 20 20 20 20 72 65   pX) ){.      re
1be10 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1be20 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  R;.    }.  }..  
1be30 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
1be40 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  no aggregate fun
1be50 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 72 65  ctions in the re
1be60 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e 6f  sult-set, and no
1be70 20 47 52 4f 55 50 20 42 59 20 0a 20 20 2a 2a 20   GROUP BY .  ** 
1be80 65 78 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e  expression, do n
1be90 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72 65 67 61  ot allow aggrega
1bea0 74 65 73 20 69 6e 20 61 6e 79 20 6f 66 20 74 68  tes in any of th
1beb0 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
1bec0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ons..  */.  asse
1bed0 72 74 28 20 21 70 2d 3e 69 73 41 67 67 20 29 3b  rt( !p->isAgg );
1bee0 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
1bef0 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 69 66 28  >pGroupBy;.  if(
1bf00 20 70 47 72 6f 75 70 42 79 20 7c 7c 20 73 4e 43   pGroupBy || sNC
1bf10 2e 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70  .hasAgg ){.    p
1bf20 2d 3e 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d  ->isAgg = 1;.  }
1bf30 65 6c 73 65 7b 0a 20 20 20 20 73 4e 43 2e 61 6c  else{.    sNC.al
1bf40 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a  lowAgg = 0;.  }.
1bf50 0a 20 20 2f 2a 20 49 66 20 61 20 48 41 56 49 4e  .  /* If a HAVIN
1bf60 47 20 63 6c 61 75 73 65 20 69 73 20 70 72 65 73  G clause is pres
1bf70 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ent, then there 
1bf80 6d 75 73 74 20 62 65 20 61 20 47 52 4f 55 50 20  must be a GROUP 
1bf90 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  BY clause..  */.
1bfa0 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67    if( p->pHaving
1bfb0 20 26 26 20 21 70 47 72 6f 75 70 42 79 20 29 7b   && !pGroupBy ){
1bfc0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1bfd0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
1bfe0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
1bff0 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  is required befo
1c000 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20  re HAVING");.   
1c010 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1c020 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
1c030 41 64 64 20 74 68 65 20 65 78 70 72 65 73 73 69  Add the expressi
1c040 6f 6e 20 6c 69 73 74 20 74 6f 20 74 68 65 20 6e  on list to the n
1c050 61 6d 65 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f  ame-context befo
1c060 72 65 20 70 61 72 73 69 6e 67 20 74 68 65 0a 20  re parsing the. 
1c070 20 2a 2a 20 6f 74 68 65 72 20 65 78 70 72 65 73   ** other expres
1c080 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 53 45 4c  sions in the SEL
1c090 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ECT statement. T
1c0a0 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a 20  his is so that. 
1c0b0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20   ** expressions 
1c0c0 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
1c0d0 75 73 65 20 28 65 74 63 2e 29 20 63 61 6e 20 72  use (etc.) can r
1c0e0 65 66 65 72 20 74 6f 20 65 78 70 72 65 73 73 69  efer to expressi
1c0f0 6f 6e 73 20 62 79 0a 20 20 2a 2a 20 61 6c 69 61  ons by.  ** alia
1c100 73 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ses in the resul
1c110 74 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  t set..  **.  **
1c120 20 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66   Minor point: If
1c130 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
1c140 65 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  e, then the expr
1c150 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20  ession will be. 
1c160 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61 74 65 64   ** re-evaluated
1c170 20 66 6f 72 20 65 61 63 68 20 72 65 66 65 72 65   for each refere
1c180 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a  nce to it..  */.
1c190 20 20 73 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70    sNC.pEList = p
1c1a0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
1c1b0 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
1c1c0 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d  veNames(&sNC, p-
1c1d0 3e 70 57 68 65 72 65 29 20 7c 7c 0a 20 20 20 20  >pWhere) ||.    
1c1e0 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
1c1f0 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
1c200 2d 3e 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20  ->pHaving) ){.  
1c210 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c220 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1c230 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b   p->pPrior==0 ){
1c240 0a 20 20 20 20 69 66 28 20 70 72 6f 63 65 73 73  .    if( process
1c250 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
1c260 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  rse, p, p->pOrde
1c270 72 42 79 2c 20 31 2c 20 26 73 4e 43 2e 68 61 73  rBy, 1, &sNC.has
1c280 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 72 65  Agg) ){.      re
1c290 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1c2a0 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  R;.    }.  }.  i
1c2b0 66 28 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47  f( processOrderG
1c2c0 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
1c2d0 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 26  , pGroupBy, 0, &
1c2e0 73 4e 43 2e 68 61 73 41 67 67 29 20 29 7b 0a 20  sNC.hasAgg) ){. 
1c2f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c300 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1c310 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
1c320 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1c330 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c340 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
1c350 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
1c360 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
1c370 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
1c380 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1c390 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
1c3a0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
1c3b0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1c3c0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1c3d0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
1c3e0 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b  tem=pGroupBy->a;
1c3f0 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
1c400 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
1c410 29 7b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  ){.      if( Exp
1c420 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 49 74  rHasProperty(pIt
1c430 65 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 41 67  em->pExpr, EP_Ag
1c440 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  g) ){.        sq
1c450 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1c460 61 72 73 65 2c 20 22 61 67 67 72 65 67 61 74 65  arse, "aggregate
1c470 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e   functions are n
1c480 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 22 0a  ot allowed in ".
1c490 20 20 20 20 20 20 20 20 20 20 20 20 22 74 68 65              "the
1c4a0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
1c4b0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
1c4c0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1c4d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c4e0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
1c4f0 20 69 73 20 6f 6e 65 20 53 45 4c 45 43 54 20 6f   is one SELECT o
1c500 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2c 20 62 65  f a compound, be
1c510 20 73 75 72 65 20 74 6f 20 72 65 73 6f 6c 76 65   sure to resolve
1c520 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 69 6e 20 74   names.  ** in t
1c530 68 65 20 6f 74 68 65 72 20 53 45 4c 45 43 54 73  he other SELECTs
1c540 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
1c550 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65  pPrior ){.    re
1c560 74 75 72 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  turn sqlite3Sele
1c570 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
1c580 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 75  , p->pPrior, pOu
1c590 74 65 72 4e 43 29 3b 0a 20 20 7d 65 6c 73 65 7b  terNC);.  }else{
1c5a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1c5b0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
1c5c0 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67  .** Reset the ag
1c5d0 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
1c5e0 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  tor..**.** The a
1c5f0 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
1c600 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66  ator is a set of
1c610 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68   memory cells th
1c620 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72  at hold.** inter
1c630 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20  mediate results 
1c640 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e  while calculatin
1c650 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  g an aggregate. 
1c660 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
1c670 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73 20 4e   simply stores N
1c680 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74  ULLs in all of t
1c690 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  hose memory cell
1c6a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1c6b0 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74  d resetAccumulat
1c6c0 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
1c6d0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
1c6e0 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
1c6f0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1c700 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1c710 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
1c720 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28 20 70 41  *pFunc;.  if( pA
1c730 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41  ggInfo->nFunc+pA
1c740 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d  ggInfo->nColumn=
1c750 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1c760 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1c770 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   i<pAggInfo->nCo
1c780 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
1c790 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c7a0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1c7b0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
1c7c0 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  i].iMem);.  }.  
1c7d0 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e  for(pFunc=pAggIn
1c7e0 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20  fo->aFunc, i=0; 
1c7f0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
1c800 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29  c; i++, pFunc++)
1c810 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1c820 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1c830 6c 6c 2c 20 30 2c 20 70 46 75 6e 63 2d 3e 69 4d  ll, 0, pFunc->iM
1c840 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75  em);.    if( pFu
1c850 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  nc->iDistinct>=0
1c860 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
1c870 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70  pE = pFunc->pExp
1c880 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  r;.      if( pE-
1c890 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  >pList==0 || pE-
1c8a0 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  >pList->nExpr!=1
1c8b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1c8c0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1c8d0 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 69 6e  se, "DISTINCT in
1c8e0 20 61 67 67 72 65 67 61 74 65 20 6d 75 73 74 20   aggregate must 
1c8f0 62 65 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20 20  be followed ".  
1c900 20 20 20 20 20 20 20 20 20 22 62 79 20 61 6e 20           "by an 
1c910 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20  expression");.  
1c920 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69        pFunc->iDi
1c930 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
1c940 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c950 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1c960 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
1c970 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
1c980 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  , pE->pList);.  
1c990 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c9a0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
1c9b0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75  enEphemeral, pFu
1c9c0 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30  nc->iDistinct, 0
1c9d0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1c9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1c9f0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
1ca00 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
1ca10 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FF);.      }.   
1ca20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1ca30 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67  Invoke the OP_Ag
1ca40 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65  gFinalize opcode
1ca50 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65   for every aggre
1ca60 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  gate function.**
1ca70 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   in the AggInfo 
1ca80 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
1ca90 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69  atic void finali
1caa0 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50  zeAggFunctions(P
1cab0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
1cac0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
1cad0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1cae0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1caf0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
1cb00 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
1cb10 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
1cb20 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
1cb30 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
1cb40 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
1cb50 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
1cb60 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
1cb70 70 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69 74  pList;.    sqlit
1cb80 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1cb90 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d  OP_AggFinal, pF-
1cba0 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70  >iMem, pList ? p
1cbb0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
1cbc0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1cbd0 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
1cbe0 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  )pF->pFunc, P4_F
1cbf0 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a  UNCDEF);.  }.}..
1cc00 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
1cc10 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d   accumulator mem
1cc20 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e  ory cells for an
1cc30 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64   aggregate based
1cc40 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65   on.** the curre
1cc50 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
1cc60 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
1cc70 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c  id updateAccumul
1cc80 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
1cc90 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
1cca0 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
1ccb0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1ccc0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
1ccd0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
1cce0 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20  c *pF;.  struct 
1ccf0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b  AggInfo_col *pC;
1cd00 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  ..  pAggInfo->di
1cd10 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
1cd20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
1cd30 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
1cd40 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
1cd50 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
1cd60 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e  int nArg;.    in
1cd70 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a  t addrNext = 0;.
1cd80 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a      int regAgg;.
1cd90 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
1cda0 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
1cdb0 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20  >pList;.    if( 
1cdc0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
1cdd0 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Arg = pList->nEx
1cde0 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67  pr;.      regAgg
1cdf0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1ce00 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
1ce10 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Arg);.      sqli
1ce20 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
1ce30 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
1ce40 74 2c 20 72 65 67 41 67 67 2c 20 30 29 3b 0a 20  t, regAgg, 0);. 
1ce50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ce60 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  nArg = 0;.      
1ce70 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  regAgg = 0;.    
1ce80 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44  }.    if( pF->iD
1ce90 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
1cea0 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73      addrNext = s
1ceb0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1cec0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73  bel(v);.      as
1ced0 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b  sert( nArg==1 );
1cee0 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69  .      codeDisti
1cef0 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e  nct(pParse, pF->
1cf00 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e  iDistinct, addrN
1cf10 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b  ext, 1, regAgg);
1cf20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1cf30 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f  F->pFunc->needCo
1cf40 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 43  llSeq ){.      C
1cf50 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
1cf60 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  0;.      struct 
1cf70 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1cf80 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Item;.      int 
1cf90 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  j;.      assert(
1cfa0 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a   pList!=0 );  /*
1cfb0 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d   pList!=0 if pF-
1cfc0 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c  >pFunc->needColl
1cfd0 53 65 71 20 69 73 20 74 72 75 65 20 2a 2f 0a 20  Seq is true */. 
1cfe0 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
1cff0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70  tem=pList->a; !p
1d000 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20  Coll && j<nArg; 
1d010 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
1d020 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
1d030 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
1d040 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
1d050 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >pExpr);.      }
1d060 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
1d070 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
1d080 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
1d090 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
1d0a0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1d0b0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1d0c0 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
1d0d0 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
1d0e0 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
1d0f0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1d100 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1d110 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65  P_AggStep, 0, re
1d120 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a  gAgg, pF->iMem,.
1d130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d140 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
1d150 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
1d160 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EF);.    sqlite3
1d170 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
1d180 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
1d190 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
1d1a0 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
1d1b0 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  g, nArg);.    sq
1d1c0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
1d1d0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
1d1e0 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
1d1f0 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  g);.    if( addr
1d200 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71  Next ){.      sq
1d210 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1d220 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78  Label(v, addrNex
1d230 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
1d240 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67  for(i=0, pC=pAgg
1d250 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41  Info->aCol; i<pA
1d260 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
1d270 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29  ator; i++, pC++)
1d280 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1d290 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43  rCode(pParse, pC
1d2a0 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65  ->pExpr, pC->iMe
1d2b0 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e  m);.  }.  pAggIn
1d2c0 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
1d2d0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
1d2e0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
1d2f0 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20  he given SELECT 
1d300 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
1d310 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
1d320 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
1d330 76 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70  various ways dep
1d340 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a  ending on the.**
1d350 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1d360 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75   SelectDest stru
1d370 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
1d380 20 62 79 20 61 72 67 75 6d 65 6e 74 20 70 44 65   by argument pDe
1d390 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73  st.** as follows
1d3a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73  :.**.**     pDes
1d3b0 74 2d 3e 65 44 65 73 74 20 20 20 20 52 65 73 75  t->eDest    Resu
1d3c0 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d  lt.**     ------
1d3d0 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
1d3e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d3f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d400 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54  -----.**     SRT
1d410 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76  _Callback    Inv
1d420 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  oke the callback
1d430 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   for each row of
1d440 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
1d450 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20  **     SRT_Mem  
1d460 20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69 72         Store fir
1d470 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d  st result in mem
1d480 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e  ory cell pDest->
1d490 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iParm.**.**     
1d4a0 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20 20  SRT_Set         
1d4b0 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73  Store results as
1d4c0 20 6b 65 79 73 20 6f 66 20 74 61 62 6c 65 20 70   keys of table p
1d4d0 44 65 73 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a  Dest->iParm. .**
1d4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4f0 20 20 20 20 20 41 70 70 6c 79 20 74 68 65 20 61       Apply the a
1d500 66 66 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61  ffinity pDest->a
1d510 66 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20 73  ffinity before s
1d520 74 6f 72 69 6e 67 20 74 68 65 6d 2e 0a 2a 2a 0a  toring them..**.
1d530 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e  **     SRT_Union
1d540 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73         Store res
1d550 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e  ults as a key in
1d560 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
1d570 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e  le pDest->iParm.
1d580 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45  .**.**     SRT_E
1d590 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76  xcept      Remov
1d5a0 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74  e results from t
1d5b0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
1d5c0 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e  le pDest->iParm.
1d5d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54  .**.**     SRT_T
1d5e0 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65  able       Store
1d5f0 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70   results in temp
1d600 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73  orary table pDes
1d610 74 2d 3e 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  t->iParm.**.**  
1d620 20 20 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20     SRT_EphemTab 
1d630 20 20 20 43 72 65 61 74 65 20 61 6e 20 74 65 6d     Create an tem
1d640 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65  porary table pDe
1d650 73 74 2d 3e 69 50 61 72 6d 20 61 6e 64 20 73 74  st->iParm and st
1d660 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ore.**          
1d670 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72             the r
1d680 65 73 75 6c 74 20 74 68 65 72 65 2e 20 54 68 65  esult there. The
1d690 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
1d6a0 6f 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20 20 20  open after.**   
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6c0 20 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a    returning..**.
1d6d0 2a 2a 20 20 20 20 20 53 52 54 5f 43 6f 72 6f 75  **     SRT_Corou
1d6e0 74 69 6e 65 20 20 20 49 6e 76 6f 6b 65 20 61 20  tine   Invoke a 
1d6f0 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20 63 6f  co-routine to co
1d700 6d 70 75 74 65 20 61 20 73 69 6e 67 6c 65 20 72  mpute a single r
1d710 6f 77 20 6f 66 20 0a 2a 2a 20 20 20 20 20 20 20  ow of .**       
1d720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
1d730 65 20 72 65 73 75 6c 74 0a 2a 2a 0a 2a 2a 20 20  e result.**.**  
1d740 20 20 20 53 52 54 5f 45 78 69 73 74 73 20 20 20     SRT_Exists   
1d750 20 20 20 53 74 6f 72 65 20 61 20 31 20 69 6e 20     Store a 1 in 
1d760 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65 73  memory cell pDes
1d770 74 2d 3e 69 50 61 72 6d 20 69 66 20 74 68 65 20  t->iParm if the 
1d780 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  result.**       
1d790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
1d7a0 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a  t is not empty..
1d7b0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44 69  **.**     SRT_Di
1d7c0 73 63 61 72 64 20 20 20 20 20 54 68 72 6f 77 20  scard     Throw 
1d7d0 74 68 65 20 72 65 73 75 6c 74 73 20 61 77 61 79  the results away
1d7e0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20  ..**.** See the 
1d7f0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
1d800 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  ) function for a
1d810 20 63 61 6e 6f 6e 69 63 61 6c 20 6c 69 73 74 69   canonical listi
1d820 6e 67 20 6f 66 20 74 68 65 20 0a 2a 2a 20 61 6c  ng of the .** al
1d830 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20  lowed values of 
1d840 65 44 65 73 74 20 61 6e 64 20 74 68 65 69 72 20  eDest and their 
1d850 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20  meanings..**.** 
1d860 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1d870 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
1d880 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  of errors.  If a
1d890 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a  ny errors are.**
1d8a0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
1d8b0 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  en an appropriat
1d8c0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
1d8d0 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50  is left in.** pP
1d8e0 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
1d8f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1d900 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20  e does NOT free 
1d910 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63  the Select struc
1d920 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20  ture passed in. 
1d930 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
1d940 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  function needs t
1d950 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a  o do that..**.**
1d960 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20 70 61   The pParent, pa
1d970 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70 50  rentTab, and *pP
1d980 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64 73 20  arentAgg fields 
1d990 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20 69 66  are filled in if
1d9a0 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20   this.** SELECT 
1d9b0 69 73 20 61 20 73 75 62 71 75 65 72 79 2e 20 20  is a subquery.  
1d9c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
1d9d0 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20   try to combine 
1d9e0 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77  this SELECT.** w
1d9f0 69 74 68 20 69 74 73 20 70 61 72 65 6e 74 20 74  ith its parent t
1da00 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  o form a single 
1da10 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49 6e 20  flat query.  In 
1da20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67  so doing, it mig
1da30 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68 65  ht.** change the
1da40 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 66 72   parent query fr
1da50 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61  om a non-aggrega
1da60 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65 67 61  te to an aggrega
1da70 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72  te query..** For
1da80 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 74 68   that reason, th
1da90 65 20 70 50 61 72 65 6e 74 41 67 67 20 66 6c 61  e pParentAgg fla
1daa0 67 20 69 73 20 70 61 73 73 65 64 20 61 73 20 61  g is passed as a
1dab0 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a   pointer, so it.
1dac0 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ** can be change
1dad0 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  d..**.** Example
1dae0 20 31 3a 20 20 20 54 68 65 20 6d 65 61 6e 69 6e   1:   The meanin
1daf0 67 20 6f 66 20 74 68 65 20 70 50 61 72 65 6e 74  g of the pParent
1db00 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
1db10 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
1db20 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45  OM t1 JOIN (SELE
1db30 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46  CT x, count(*) F
1db40 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b  ROM t2) JOIN t3;
1db50 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20 20 20 20  .**    \        
1db60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
1db70 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
1db80 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
1db90 2f 0a 2a 2a 20 20 20 20 20 5c 20 20 20 20 20 20  /.**     \      
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbd0 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f  /.**      \_____
1dbe0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20  _______________ 
1dbf0 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f  outer query ____
1dc00 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
1dc10 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1dc20 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ine is called fo
1dc30 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1dc40 79 20 66 69 72 73 74 2e 20 20 20 46 6f 72 20 74  y first.   For t
1dc50 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61  hat call,.** pPa
1dc60 72 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  rent will be NUL
1dc70 4c 2e 20 20 44 75 72 69 6e 67 20 74 68 65 20 70  L.  During the p
1dc80 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65  rocessing of the
1dc90 20 6f 75 74 65 72 20 71 75 65 72 79 2c 20 74 68   outer query, th
1dca0 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  is .** routine i
1dcb0 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  s called recursi
1dcc0 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20 74  vely to handle t
1dcd0 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 46 6f  he subquery.  Fo
1dce0 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 0a  r the recursive.
1dcf0 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74  ** call, pParent
1dd00 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74   will point to t
1dd10 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
1dd20 20 42 65 63 61 75 73 65 20 74 68 65 20 73 75 62   Because the sub
1dd30 71 75 65 72 79 20 69 73 0a 2a 2a 20 74 68 65 20  query is.** the 
1dd40 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69  second element i
1dd50 6e 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  n a three-way jo
1dd60 69 6e 2c 20 74 68 65 20 70 61 72 65 6e 74 54 61  in, the parentTa
1dd70 62 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c  b parameter will
1dd80 0a 2a 2a 20 62 65 20 31 20 28 74 68 65 20 32 6e  .** be 1 (the 2n
1dd90 64 20 76 61 6c 75 65 20 6f 66 20 61 20 30 2d 69  d value of a 0-i
1dda0 6e 64 65 78 65 64 20 61 72 72 61 79 2e 29 0a 2a  ndexed array.).*
1ddb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
1ddc0 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
1ddd0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
1dde0 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
1ddf0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
1de00 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1de10 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
1de20 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
1de30 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ded. */.  Select
1de40 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
1de50 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
1de60 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65  ith the query re
1de70 73 75 6c 74 73 20 2a 2f 0a 20 20 53 65 6c 65 63  sults */.  Selec
1de80 74 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20  t *pParent,     
1de90 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
1dea0 45 43 54 20 66 6f 72 20 77 68 69 63 68 20 74 68  ECT for which th
1deb0 69 73 20 69 73 20 61 20 73 75 62 2d 71 75 65 72  is is a sub-quer
1dec0 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e  y */.  int paren
1ded0 74 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a  tTab,         /*
1dee0 20 49 6e 64 65 78 20 69 6e 20 70 50 61 72 65 6e   Index in pParen
1def0 74 2d 3e 70 53 72 63 20 6f 66 20 74 68 69 73 20  t->pSrc of this 
1df00 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  query */.  int *
1df10 70 50 61 72 65 6e 74 41 67 67 20 20 20 20 20 20  pParentAgg      
1df20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61    /* True if pPa
1df30 72 65 6e 74 20 75 73 65 73 20 61 67 67 72 65 67  rent uses aggreg
1df40 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
1df50 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1df70 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
1df80 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
1df90 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74  Info;     /* Ret
1dfa0 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  urn from sqlite3
1dfb0 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a  WhereBegin() */.
1dfc0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
1dfd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1dfe0 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
1dff0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1e000 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  on */.  int isAg
1e010 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
1e020 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63  * True for selec
1e030 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f  t lists like "co
1e040 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70  unt(*)" */.  Exp
1e050 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
1e060 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63      /* List of c
1e070 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63  olumns to extrac
1e080 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  t. */.  SrcList 
1e090 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f  *pTabList;     /
1e0a0 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
1e0b0 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20   to select from 
1e0c0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
1e0d0 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
1e0e0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
1e0f0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
1e100 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
1e110 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  derBy;    /* The
1e120 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1e130 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
1e140 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
1e150 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68  roupBy;    /* Th
1e160 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
1e170 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
1e180 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
1e190 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng;         /* T
1e1a0 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
1e1b0 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
1e1c0 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e  /.  int isDistin
1e1d0 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ct;        /* Tr
1e1e0 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
1e1f0 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  CT keyword is pr
1e200 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64  esent */.  int d
1e210 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
1e220 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73    /* Table to us
1e230 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
1e240 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  ct set */.  int 
1e250 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
1e260 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
1e270 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
1e280 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  function */.  in
1e290 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b  t addrSortIndex;
1e2a0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1e2b0 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68  of an OP_OpenEph
1e2c0 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
1e2d0 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20  on */.  AggInfo 
1e2e0 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f  sAggInfo;      /
1e2f0 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73  * Information us
1e300 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20  ed by aggregate 
1e310 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74  queries */.  int
1e320 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20   iEnd;          
1e330 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1e340 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
1e350 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69   query */.  sqli
1e360 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
1e370 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
1e380 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
1e390 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ..  db = pParse-
1e3a0 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  >db;.  if( p==0 
1e3b0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1e3c0 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
1e3d0 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Err ){.    retur
1e3e0 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 1;.  }.  if( s
1e3f0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1e400 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
1e410 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20  ELECT, 0, 0, 0) 
1e420 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
1e430 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20  mset(&sAggInfo, 
1e440 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e  0, sizeof(sAggIn
1e450 66 6f 29 29 3b 0a 0a 20 20 70 4f 72 64 65 72 42  fo));..  pOrderB
1e460 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
1e470 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65  .  if( Ignorable
1e480 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
1e490 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  {.    p->pOrderB
1e4a0 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  y = 0;..    /* I
1e4b0 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 74 68  n these cases th
1e4c0 65 20 44 49 53 54 49 4e 43 54 20 6f 70 65 72 61  e DISTINCT opera
1e4d0 74 6f 72 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66  tor makes no dif
1e4e0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 20  ference to the. 
1e4f0 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 2c 20 73     ** results, s
1e500 6f 20 72 65 6d 6f 76 65 20 69 74 20 69 66 20 69  o remove it if i
1e510 74 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64  t were specified
1e520 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1e530 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74  ert(pDest->eDest
1e540 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20  ==SRT_Exists || 
1e550 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1e560 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20  T_Union || .    
1e570 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
1e580 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20  est==SRT_Except 
1e590 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
1e5a0 3d 53 52 54 5f 44 69 73 63 61 72 64 29 3b 0a 20  =SRT_Discard);. 
1e5b0 20 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74     p->isDistinct
1e5c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
1e5d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73  sqlite3SelectRes
1e5e0 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2c 20  olve(pParse, p, 
1e5f0 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  0) ){.    goto s
1e600 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
1e610 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
1e620 4f 72 64 65 72 42 79 3b 0a 0a 0a 20 20 2f 2a 20  OrderBy;...  /* 
1e630 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65  Make local copie
1e640 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  s of the paramet
1e650 65 72 73 20 66 6f 72 20 74 68 69 73 20 71 75 65  ers for this que
1e660 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c  ry..  */.  pTabL
1e670 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
1e680 20 69 73 41 67 67 20 3d 20 70 2d 3e 69 73 41 67   isAgg = p->isAg
1e690 67 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  g;.  pEList = p-
1e6a0 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
1e6b0 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  EList==0 ) goto 
1e6c0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
1e6d0 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65  * .  ** Do not e
1e6e0 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67  ven attempt to g
1e6f0 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65  enerate any code
1e700 20 69 66 20 77 65 20 68 61 76 65 20 61 6c 72 65   if we have alre
1e710 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72  ady seen.  ** er
1e720 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69 73  rors before this
1e730 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e   routine starts.
1e740 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
1e750 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74  se->nErr>0 ) got
1e760 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
1e770 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73 20   /* ORDER BY is 
1e780 69 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65  ignored for some
1e790 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20   destinations.. 
1e7a0 20 2a 2f 0a 20 20 69 66 28 20 49 67 6e 6f 72 61   */.  if( Ignora
1e7b0 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
1e7c0 29 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42  ) ){.    pOrderB
1e7d0 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  y = 0;.  }..  /*
1e7e0 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   Begin generatin
1e7f0 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76  g code..  */.  v
1e800 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1e810 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1e820 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c   v==0 ) goto sel
1e830 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 47  ect_end;..  /* G
1e840 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1e850 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
1e860 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1e870 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65  use.  */.#if !de
1e880 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1e890 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1e8a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1e8b0 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28  MIT_VIEW).  for(
1e8c0 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20  i=0; !p->pPrior 
1e8d0 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  && i<pTabList->n
1e8e0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Src; i++){.    s
1e8f0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1e900 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
1e910 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20  bList->a[i];.   
1e920 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
1e930 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
1e940 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c  ub = pItem->pSel
1e950 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 41  ect;.    int isA
1e960 67 67 53 75 62 3b 0a 20 20 20 20 63 68 61 72 20  ggSub;.    char 
1e970 2a 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e  *zName = pItem->
1e980 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 69 66 28 20  zName;..    if( 
1e990 70 53 75 62 3d 3d 30 20 7c 7c 20 70 49 74 65 6d  pSub==0 || pItem
1e9a0 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 29 20  ->isPopulated ) 
1e9b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
1e9c0 28 20 7a 4e 61 6d 65 21 3d 30 20 29 7b 20 20 20  ( zName!=0 ){   
1e9d0 2f 2a 20 41 6e 20 73 71 6c 20 76 69 65 77 20 2a  /* An sql view *
1e9e0 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
1e9f0 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
1ea00 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
1ea10 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
1ea20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
1ea30 68 43 6f 6e 74 65 78 74 20 3d 20 7a 4e 61 6d 65  hContext = zName
1ea40 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1ea50 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
1ea60 65 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20  e(pParse, pSub, 
1ea70 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
1ea80 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
1ea90 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
1eaa0 78 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  xt;.      if( rc
1eab0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
1eac0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
1ead0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1eae0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72  /* Increment Par
1eaf0 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68  se.nHeight by th
1eb00 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20  e height of the 
1eb10 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69  largest expressi
1eb20 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72  on.    ** tree r
1eb30 65 66 65 72 65 64 20 74 6f 20 62 79 20 74 68 69  efered to by thi
1eb40 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65  s, the parent se
1eb50 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20  lect. The child 
1eb60 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61  select.    ** ma
1eb70 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73  y contain expres
1eb80 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74  sion trees of at
1eb90 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51   most.    ** (SQ
1eba0 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
1ebb0 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68  PTH-Parse.nHeigh
1ebc0 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20  t) height. This 
1ebd0 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20  is a bit.    ** 
1ebe0 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76  more conservativ
1ebf0 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  e than necessary
1ec00 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65  , but much easie
1ec10 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67  r than enforcing
1ec20 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74  .    ** an exact
1ec30 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   limit..    */. 
1ec40 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
1ec50 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht += sqlite3Sel
1ec60 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
1ec70 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
1ec80 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 73 75  to see if the su
1ec90 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62  bquery can be ab
1eca0 73 6f 72 62 65 64 20 69 6e 74 6f 20 74 68 65 20  sorbed into the 
1ecb0 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69  parent. */.    i
1ecc0 73 41 67 67 53 75 62 20 3d 20 70 53 75 62 2d 3e  sAggSub = pSub->
1ecd0 69 73 41 67 67 3b 0a 20 20 20 20 69 66 28 20 66  isAgg;.    if( f
1ece0 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70  lattenSubquery(p
1ecf0 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41  Parse, p, i, isA
1ed00 67 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b  gg, isAggSub) ){
1ed10 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67  .      if( isAgg
1ed20 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Sub ){.        p
1ed30 2d 3e 69 73 41 67 67 20 3d 20 69 73 41 67 67 20  ->isAgg = isAgg 
1ed40 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1ed50 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d     i = -1;.    }
1ed60 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1ed70 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
1ed80 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68  t(&dest, SRT_Eph
1ed90 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43  emTab, pItem->iC
1eda0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 73 71  ursor);.      sq
1edb0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
1edc0 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 2c  se, pSub, &dest,
1edd0 20 70 2c 20 69 2c 20 26 69 73 41 67 67 29 3b 0a   p, i, &isAgg);.
1ede0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
1edf0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
1ee00 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1ee10 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
1ee20 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
1ee30 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
1ee40 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht -= sqlite3Sel
1ee50 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
1ee60 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  ;.    pTabList =
1ee70 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66   p->pSrc;.    if
1ee80 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  ( !IgnorableOrde
1ee90 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
1eea0 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70      pOrderBy = p
1eeb0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
1eec0 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d  }.  }.  pEList =
1eed0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64   p->pEList;.#end
1eee0 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  if.  pWhere = p-
1eef0 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75  >pWhere;.  pGrou
1ef00 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
1ef10 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70  y;.  pHaving = p
1ef20 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 44  ->pHaving;.  isD
1ef30 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44  istinct = p->isD
1ef40 69 73 74 69 6e 63 74 3b 0a 0a 23 69 66 6e 64 65  istinct;..#ifnde
1ef50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
1ef60 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
1ef70 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
1ef80 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  re a sequence of
1ef90 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65   queries, do the
1efa0 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69   earlier ones fi
1efb0 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rst..  */.  if( 
1efc0 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
1efd0 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f   if( p->pRightmo
1efe0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  st==0 ){.      S
1eff0 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70  elect *pLoop, *p
1f000 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20  Right = 0;.     
1f010 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
1f020 20 20 20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74      int mxSelect
1f030 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f  ;.      for(pLoo
1f040 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  p=p; pLoop; pLoo
1f050 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c  p=pLoop->pPrior,
1f060 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20   cnt++){.       
1f070 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f   pLoop->pRightmo
1f080 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
1f090 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70  pLoop->pNext = p
1f0a0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 70  Right;.        p
1f0b0 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20  Right = pLoop;. 
1f0c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 78 53       }.      mxS
1f0d0 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d  elect = db->aLim
1f0e0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
1f0f0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d  COMPOUND_SELECT]
1f100 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78 53 65  ;.      if( mxSe
1f110 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d 78 53 65  lect && cnt>mxSe
1f120 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
1f130 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1f140 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
1f150 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f  y terms in compo
1f160 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20  und SELECT");.  
1f170 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1f180 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f190 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
1f1a0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
1f1b0 70 44 65 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64  pDest);.  }.#end
1f1c0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74  if..  /* If writ
1f1d0 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72  ing to memory or
1f1e0 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65   generating a se
1f1f0 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69  t.  ** only a si
1f200 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20  ngle column may 
1f210 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
1f220 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f230 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69  MIT_SUBQUERY.  i
1f240 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69  f( checkForMulti
1f250 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f  ColumnSelectErro
1f260 72 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c  r(pParse, pDest,
1f270 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20   pEList->nExpr) 
1f280 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
1f290 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
1f2a0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 6f 73 73  if..  /* If poss
1f2b0 69 62 6c 65 2c 20 72 65 77 72 69 74 65 20 74 68  ible, rewrite th
1f2c0 65 20 71 75 65 72 79 20 74 6f 20 75 73 65 20 47  e query to use G
1f2d0 52 4f 55 50 20 42 59 20 69 6e 73 74 65 61 64 20  ROUP BY instead 
1f2e0 6f 66 20 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a  of DISTINCT..  *
1f2f0 2a 20 47 52 4f 55 50 20 42 59 20 6d 61 79 20 75  * GROUP BY may u
1f300 73 65 20 61 6e 20 69 6e 64 65 78 2c 20 44 49 53  se an index, DIS
1f310 54 49 4e 43 54 20 6e 65 76 65 72 20 64 6f 65 73  TINCT never does
1f320 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
1f330 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 21 70  isDistinct && !p
1f340 2d 3e 69 73 41 67 67 20 26 26 20 21 70 2d 3e 70  ->isAgg && !p->p
1f350 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 70  GroupBy ){.    p
1f360 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
1f370 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
1f380 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  db, p->pEList);.
1f390 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
1f3a0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
1f3b0 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20  p->isDistinct = 
1f3c0 30 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63  0;.    isDistinc
1f3d0 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t = 0;.  }..  /*
1f3e0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
1f3f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
1f400 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69   then this sorti
1f410 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69  ng.  ** index mi
1f420 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ght end up being
1f430 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64   unused if the d
1f440 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a  ata can be .  **
1f450 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72   extracted in pr
1f460 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20  e-sorted order. 
1f470 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
1f480 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  case, then the. 
1f490 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   ** OP_OpenEphem
1f4a0 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
1f4b0 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
1f4c0 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f   to an OP_Noop o
1f4d0 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75  nce.  ** we figu
1f4e0 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  re out that the 
1f4f0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73  sorting index is
1f500 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68   not needed.  Th
1f510 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a  e addrSortIndex.
1f520 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73    ** variable is
1f530 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74   used to facilit
1f540 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e  ate that change.
1f550 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
1f560 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
1f570 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
1f580 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
1f590 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
1f5a0 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  t(pParse, pOrder
1f5b0 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42  By);.    pOrderB
1f5c0 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50  y->iECursor = pP
1f5d0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
1f5e0 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
1f5f0 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49  m[2] = addrSortI
1f600 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c  ndex =.      sql
1f610 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1f620 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
1f630 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
1f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1f650 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
1f660 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  r, pOrderBy->nEx
1f670 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20  pr+2, 0,.       
1f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f690 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
1f6a0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
1f6b0 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73  HANDOFF);.  }els
1f6c0 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49  e{.    addrSortI
1f6d0 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  ndex = -1;.  }..
1f6e0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
1f6f0 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
1f700 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
1f710 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
1f720 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
1f730 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
1f740 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
1f750 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f760 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
1f770 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74  Ephemeral, pDest
1f780 2d 3e 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  ->iParm, pEList-
1f790 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
1f7a0 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
1f7b0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20  er..  */.  iEnd 
1f7c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1f7d0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d  eLabel(v);.  com
1f7e0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
1f7f0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45  rs(pParse, p, iE
1f800 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  nd);..  /* Open 
1f810 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
1f820 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
1f830 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
1f840 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e  /.  if( isDistin
1f850 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  ct ){.    KeyInf
1f860 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
1f870 20 61 73 73 65 72 74 28 20 69 73 41 67 67 20 7c   assert( isAgg |
1f880 7c 20 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20  | pGroupBy );.  
1f890 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61    distinct = pPa
1f8a0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
1f8b0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
1f8c0 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
1f8d0 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
1f8e0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
1f8f0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1f900 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64  OpenEphemeral, d
1f910 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  istinct, 0, 0,. 
1f920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f930 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
1f940 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
1f950 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d  FO_HANDOFF);.  }
1f960 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e  else{.    distin
1f970 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ct = -1;.  }..  
1f980 2f 2a 20 41 67 67 72 65 67 61 74 65 20 61 6e 64  /* Aggregate and
1f990 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71   non-aggregate q
1f9a0 75 65 72 69 65 73 20 61 72 65 20 68 61 6e 64 6c  ueries are handl
1f9b0 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 2a  ed differently *
1f9c0 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26  /.  if( !isAgg &
1f9d0 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  & pGroupBy==0 ){
1f9e0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73  .    /* This cas
1f9f0 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67 67  e is for non-agg
1fa00 72 65 67 61 74 65 20 71 75 65 72 69 65 73 0a 20  regate queries. 
1fa10 20 20 20 2a 2a 20 42 65 67 69 6e 20 74 68 65 20     ** Begin the 
1fa20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20  database scan.  
1fa30 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20    */.    pWInfo 
1fa40 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
1fa50 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
1fa60 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70  List, pWhere, &p
1fa70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20  OrderBy, 0);.   
1fa80 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
1fa90 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1faa0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72  ;..    /* If sor
1fab0 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
1fac0 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
1fad0 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70   prior OP_OpenEp
1fae0 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20  hemeral .    ** 
1faf0 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65  instruction ende
1fb00 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e  d up not being n
1fb10 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e  eeded, then chan
1fb20 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
1fb30 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69  hemeral.    ** i
1fb40 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a  nto an OP_Noop..
1fb50 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61      */.    if( a
1fb60 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20  ddrSortIndex>=0 
1fb70 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  && pOrderBy==0 )
1fb80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1fb90 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
1fba0 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  v, addrSortIndex
1fbb0 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  , 1);.      p->a
1fbc0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
1fbd0 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
1fbe0 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64  /* Use the stand
1fbf0 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20  ard inner loop. 
1fc00 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1fc10 28 21 69 73 44 69 73 74 69 6e 63 74 29 3b 0a 20  (!isDistinct);. 
1fc20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
1fc30 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  op(pParse, p, pE
1fc40 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64  List, 0, 0, pOrd
1fc50 65 72 42 79 2c 20 2d 31 2c 20 70 44 65 73 74 2c  erBy, -1, pDest,
1fc60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fc70 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f       pWInfo->iCo
1fc80 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e  ntinue, pWInfo->
1fc90 69 42 72 65 61 6b 29 3b 0a 0a 20 20 20 20 2f 2a  iBreak);..    /*
1fca0 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   End the databas
1fcb0 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
1fcc0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57   */.    sqlite3W
1fcd0 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
1fce0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1fcf0 20 54 68 69 73 20 69 73 20 74 68 65 20 70 72 6f   This is the pro
1fd00 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
1fd10 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f  egate queries */
1fd20 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
1fd30 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65   sNC;    /* Name
1fd40 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f   context for pro
1fd50 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74  cessing aggregat
1fd60 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
1fd70 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20  .    int iAMem; 
1fd80 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1fd90 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
1fda0 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e  r storing curren
1fdb0 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  t GROUP BY */.  
1fdc0 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20    int iBMem;    
1fdd0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
1fde0 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70  em address for p
1fdf0 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59  revious GROUP BY
1fe00 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65   */.    int iUse
1fe10 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Flag;       /* M
1fe20 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69  em address holdi
1fe30 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69  ng flag indicati
1fe40 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  ng that at least
1fe50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fe60 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20           ** one 
1fe70 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74  row of the input
1fe80 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74   to the aggregat
1fe90 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20  or has been.    
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1feb0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64      ** processed
1fec0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f   */.    int iAbo
1fed0 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d  rtFlag;     /* M
1fee0 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68  em address which
1fef0 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62   causes query ab
1ff00 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20  ort if positive 
1ff10 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70  */.    int group
1ff20 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f  BySort;    /* Ro
1ff30 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75  ws come from sou
1ff40 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20  rce in GROUP BY 
1ff50 6f 72 64 65 72 20 2a 2f 0a 0a 0a 20 20 20 20 2f  order */...    /
1ff60 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1ff70 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 61  variables hold a
1ff80 64 64 72 65 73 73 65 73 20 6f 72 20 6c 61 62 65  ddresses or labe
1ff90 6c 73 20 66 6f 72 20 70 61 72 74 73 20 6f 66 20  ls for parts of 
1ffa0 74 68 65 0a 20 20 20 20 2a 2a 20 76 69 72 74 75  the.    ** virtu
1ffb0 61 6c 20 6d 61 63 68 69 6e 65 20 70 72 6f 67 72  al machine progr
1ffc0 61 6d 20 77 65 20 61 72 65 20 70 75 74 74 69 6e  am we are puttin
1ffd0 67 20 74 6f 67 65 74 68 65 72 20 2a 2f 0a 20 20  g together */.  
1ffe0 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74    int addrOutput
1fff0 52 6f 77 3b 20 20 20 20 20 20 2f 2a 20 53 74 61  Row;      /* Sta
20000 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65  rt of subroutine
20010 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
20020 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20  result row */.  
20030 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52    int regOutputR
20040 6f 77 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ow;       /* Ret
20050 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
20060 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20  ster for output 
20070 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
20080 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f    int addrSetAbo
20090 72 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74  rt;       /* Set
200a0 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20   the abort flag 
200b0 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
200c0 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74 69 61    int addrInitia
200d0 6c 69 7a 65 4c 6f 6f 70 3b 20 2f 2a 20 53 74 61  lizeLoop; /* Sta
200e0 72 74 20 6f 66 20 63 6f 64 65 20 74 68 61 74 20  rt of code that 
200f0 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20  initializes the 
20100 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20  input loop */.  
20110 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c    int addrTopOfL
20120 6f 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 6f 70  oop;      /* Top
20130 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f   of the input lo
20140 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  op */.    int ad
20150 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  drEnd;          
20160 20 20 2f 2a 20 45 6e 64 20 6f 66 20 61 6c 6c 20    /* End of all 
20170 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20  processing */.  
20180 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e    int addrSortin
20190 67 49 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65  gIdx;     /* The
201a0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
201b0 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e  l for the sortin
201c0 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  g index */.    i
201d0 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20  nt addrReset;   
201e0 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75         /* Subrou
201f0 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69  tine for resetti
20200 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ng the accumulat
20210 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  or */.    int re
20220 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 20 20  gReset;         
20230 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72    /* Return addr
20240 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
20250 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e   reset subroutin
20260 65 20 2a 2f 0a 0a 20 20 20 20 61 64 64 72 45 6e  e */..    addrEn
20270 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
20280 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
20290 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
202a0 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
202b0 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
202c0 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
202d0 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
202e0 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
202f0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
20300 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
20310 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
20320 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
20330 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
20340 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
20350 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
20360 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
20370 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
20380 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
20390 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f      sNC.pAggInfo
203a0 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20   = &sAggInfo;.  
203b0 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
203c0 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
203d0 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
203e0 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20  >nExpr+1 : 0;.  
203f0 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
20400 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
20410 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
20420 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
20430 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  NC, pEList);.   
20440 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
20450 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
20460 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
20470 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
20480 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20490 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
204a0 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29  s(&sNC, pHaving)
204b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67  ;.    }.    sAgg
204c0 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f  Info.nAccumulato
204d0 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  r = sAggInfo.nCo
204e0 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  lumn;.    for(i=
204f0 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46  0; i<sAggInfo.nF
20500 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unc; i++){.     
20510 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
20520 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
20530 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
20540 69 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74 29  i].pExpr->pList)
20550 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
20560 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
20570 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
20580 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63  nd;..    /* Proc
20590 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
205a0 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50  gates with GROUP
205b0 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66   BY is very diff
205c0 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a  erent and.    **
205d0 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c   much more compl
205e0 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74  ex than aggregat
205f0 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f  es without a GRO
20600 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  UP BY..    */.  
20610 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
20620 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  {.      KeyInfo 
20630 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b  *pKeyInfo;  /* K
20640 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  eying informatio
20650 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20  n for the group 
20660 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  by clause */.   
20670 20 20 20 69 6e 74 20 6a 31 3b 0a 0a 20 20 20 20     int j1;..    
20680 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65    /* Create labe
20690 6c 73 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  ls that we will 
206a0 62 65 20 6e 65 65 64 69 6e 67 0a 20 20 20 20 20  be needing.     
206b0 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 49 6e   */.      addrIn
206c0 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 20 3d 20 73  itializeLoop = s
206d0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
206e0 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f  bel(v);..      /
206f0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
20700 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
20710 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20  we might need a 
20720 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f  sorting index to
20730 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d  .      ** implem
20740 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74  ent it.  Allocat
20750 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69  e that sorting i
20760 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74  ndex now.  If it
20770 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20   turns out.     
20780 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
20790 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72  ot need it after
207a0 20 61 6c 6c 2c 20 74 68 65 20 4f 70 65 6e 45 70   all, the OpenEp
207b0 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
207c0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  ion.      ** wil
207d0 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
207e0 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20  nto a Noop.  .  
207f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67      */.      sAg
20800 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
20810 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
20820 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  +;.      pKeyInf
20830 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
20840 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
20850 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20  pGroupBy);.     
20860 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20   addrSortingIdx 
20870 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
20880 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
20890 68 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20 20 20  hemeral, .      
208a0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
208b0 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66  tingIdx, sAggInf
208c0 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
208d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  , .          0, 
208e0 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
208f0 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
20900 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  OFF);..      /* 
20910 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
20920 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64  y locations used
20930 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67   by GROUP BY agg
20940 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e  regate processin
20950 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  g.      */.     
20960 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50   iUseFlag = ++pP
20970 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
20980 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b    iAbortFlag = +
20990 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
209a0 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61       iAMem = pPa
209b0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
209c0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
209d0 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
209e0 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65  Expr;.      iBMe
209f0 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
20a00 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
20a10 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
20a20 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
20a30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20a40 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
20a50 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61  er, 0, iAbortFla
20a60 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
20a70 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72  mment((v, "clear
20a80 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
20a90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20aa0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
20ab0 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c  teger, 0, iUseFl
20ac0 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
20ad0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69  omment((v, "indi
20ae0 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  cate accumulator
20af0 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20   empty"));.     
20b00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20b10 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
20b20 2c 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65  , addrInitialize
20b30 4c 6f 6f 70 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Loop);..      /*
20b40 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
20b50 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
20b60 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  uts a single row
20b70 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
20b80 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68       ** set.  Th
20b90 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69  is subroutine fi
20ba0 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65  rst looks at the
20bb0 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69   iUseFlag.  If i
20bc0 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a  UseFlag.      **
20bd0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
20be0 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20   equal to zero, 
20bf0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  the subroutine i
20c00 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20  s a no-op.  If. 
20c10 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63       ** the proc
20c20 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72  essing calls for
20c30 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62   the query to ab
20c40 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75  ort, this subrou
20c50 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tine.      ** in
20c60 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62  crements the iAb
20c70 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c  ortFlag memory l
20c80 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72  ocation before r
20c90 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20  eturning in.    
20ca0 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69    ** order to si
20cb0 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20  gnal the caller 
20cc0 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20  to abort..      
20cd0 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74  */.      addrSet
20ce0 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Abort = sqlite3V
20cf0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
20d00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20d10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20d20 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62  _Integer, 1, iAb
20d30 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
20d40 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
20d50 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22  "set abort flag"
20d60 29 29 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74  ));.      regOut
20d70 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73  putRow = ++pPars
20d80 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
20d90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
20da0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
20db0 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
20dc0 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
20dd0 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  w = sqlite3VdbeC
20de0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
20df0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20e00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
20e10 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64  os, iUseFlag, ad
20e20 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a  drOutputRow+2);.
20e30 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
20e40 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72  t((v, "Groupby r
20e50 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20  esult generator 
20e60 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a  entry point"));.
20e70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20e80 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
20e90 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
20ea0 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c  ow);.      final
20eb0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
20ec0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
20ed0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48  o);.      if( pH
20ee0 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  aving ){.       
20ef0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
20f00 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
20f10 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  ing, addrOutputR
20f20 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  ow+1, SQLITE_JUM
20f30 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
20f40 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  }.      selectIn
20f50 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
20f60 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c  p, p->pEList, 0,
20f70 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20   0, pOrderBy,.  
20f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f90 20 20 20 20 64 69 73 74 69 6e 63 74 2c 20 70 44      distinct, pD
20fa0 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
20fb0 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f             addrO
20fc0 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72  utputRow+1, addr
20fd0 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20  SetAbort);.     
20fe0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20ff0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
21000 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
21010 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
21020 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70  t((v, "end group
21030 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
21040 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
21050 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
21060 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
21070 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75  l reset the grou
21080 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72  p-by accumulator
21090 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
210a0 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69  addrReset = sqli
210b0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
210c0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67  dr(v);.      reg
210d0 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  Reset = ++pParse
210e0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
210f0 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
21100 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
21110 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21120 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
21130 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65  _Return, regRese
21140 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65  t);..      /* Be
21150 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20  gin a loop that 
21160 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c  will extract all
21170 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20   source rows in 
21180 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a  GROUP BY order..
21190 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69        ** This mi
211a0 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20  ght involve two 
211b0 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77  separate loops w
211c0 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69  ith an OP_Sort i
211d0 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20  n between, or.  
211e0 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
211f0 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70  be a single loop
21200 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e   that uses an in
21210 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69  dex to extract i
21220 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20  nformation.     
21230 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74   ** in the right
21240 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20   order to begin 
21250 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  with..      */. 
21260 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21270 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
21280 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f  addrInitializeLo
21290 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
212a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
212b0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
212c0 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
212d0 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
212e0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
212f0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
21300 74 2c 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f  t, pWhere, &pGro
21310 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  upBy, 0);.      
21320 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
21330 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
21340 0a 20 20 20 20 20 20 69 66 28 20 70 47 72 6f 75  .      if( pGrou
21350 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBy==0 ){.      
21360 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a    /* The optimiz
21370 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65  er is able to de
21380 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72  liver rows in gr
21390 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a  oup by order so.
213a0 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f          ** we do
213b0 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72   not have to sor
213c0 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45  t.  The OP_OpenE
213d0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
213e0 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
213f0 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65  * cancelled late
21400 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69  r because we sti
21410 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74  ll need to use t
21420 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20  he pKeyInfo.    
21430 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
21440 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
21450 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 67  oupBy;.        g
21460 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a  roupBySort = 0;.
21470 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21480 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65       /* Rows are
21490 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75   coming out in u
214a0 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65  ndetermined orde
214b0 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70  r.  We have to p
214c0 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  ush.        ** e
214d0 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73  ach row into a s
214e0 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65  orting index, te
214f0 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73  rminate the firs
21500 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  t loop,.        
21510 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65  ** then loop ove
21520 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
21530 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  dex in order to 
21540 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20  get the output. 
21550 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72         ** in sor
21560 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ted order.      
21570 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
21580 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
21590 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
215a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
215b0 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  l;.        int n
215c0 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20  GroupBy;..      
215d0 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
215e0 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75  1;.        nGrou
215f0 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  pBy = pGroupBy->
21600 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e  nExpr;.        n
21610 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b  Col = nGroupBy +
21620 20 31 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20   1;.        j = 
21630 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20  nGroupBy+1;.    
21640 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
21650 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
21660 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
21670 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43   if( sAggInfo.aC
21680 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c  ol[i].iSorterCol
21690 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
216a0 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20        nCol++;.  
216b0 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
216c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
216d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
216e0 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
216f0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
21700 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
21710 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
21720 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
21730 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42  , pGroupBy, regB
21740 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ase, 0);.       
21750 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21760 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
21770 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  e, sAggInfo.sort
21780 69 6e 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e  ingIdx,regBase+n
21790 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
217a0 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31    j = nGroupBy+1
217b0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
217c0 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
217d0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
217e0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
217f0 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
21800 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  = &sAggInfo.aCol
21810 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
21820 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
21830 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20  Column>=j ){.   
21840 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20           int r1 
21850 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 23  = j + regBase;.#
21860 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
21870 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32            int r2
21880 20 3d 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   = .#endif.     
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
218b0 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
218c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
218d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218e0 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f   pCol->pTab, pCo
218f0 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c  l->iColumn, pCol
21900 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20 30 29  ->iTable, r1, 0)
21910 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  ;.            j+
21920 2b 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  +;..            
21930 2f 2a 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  /* sAggInfo.aCol
21940 5b 5d 20 6f 6e 6c 79 20 63 6f 6e 74 61 69 6e 73  [] only contains
21950 20 6f 6e 65 20 65 6e 74 72 79 20 70 65 72 20 63   one entry per c
21960 6f 6c 75 6d 6e 2e 20 20 53 6f 0a 20 20 20 20 20  olumn.  So.     
21970 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 72 65         ** The re
21980 66 65 72 65 6e 63 65 20 74 6f 20 70 43 6f 6c 2d  ference to pCol-
21990 3e 69 43 6f 6c 75 6d 6e 2c 70 43 6f 6c 2d 3e 69  >iColumn,pCol->i
219a0 54 61 62 6c 65 20 6d 75 73 74 20 68 61 76 65 20  Table must have 
219b0 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20  been.           
219c0 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 65   ** the first re
219d0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 61 74 20  ference to that 
219e0 63 6f 6c 75 6d 6e 2e 20 20 48 65 6e 63 65 2c 20  column.  Hence, 
219f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
21a00 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 47 65  sqliteExprCodeGe
21a10 74 43 6f 6c 75 6d 6e 20 69 73 20 67 75 61 72 61  tColumn is guara
21a20 6e 74 65 65 64 20 74 6f 20 70 75 74 20 74 68 65  nteed to put the
21a30 20 72 65 73 75 6c 74 20 69 6e 0a 20 20 20 20 20   result in.     
21a40 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f         ** the co
21a50 6c 75 6d 6e 20 72 65 71 75 65 73 74 65 64 2e 20  lumn requested. 
21a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
21a70 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
21a80 72 74 28 20 72 31 3d 3d 72 32 20 29 3b 0a 20 20  rt( r1==r2 );.  
21a90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21aa0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52    }.        regR
21ab0 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
21ac0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
21ad0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
21ae0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
21af0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
21b00 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65  egBase, nCol, re
21b10 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
21b20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21b30 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
21b40 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ert, sAggInfo.so
21b50 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63  rtingIdx, regRec
21b60 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
21b70 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
21b80 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
21b90 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
21ba0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
21bb0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
21bc0 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a  regBase, nCol);.
21bd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
21be0 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
21bf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21c00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21c10 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  _Sort, sAggInfo.
21c20 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
21c30 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64  End);.        Vd
21c40 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
21c50 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b  ROUP BY sort"));
21c60 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
21c70 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  o.useSortingIdx 
21c80 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 1;.      }..  
21c90 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
21ca0 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
21cb0 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73  P BY terms and s
21cc0 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20  tore in b0, b1, 
21cd0 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28  b2....      ** (
21ce0 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63  b0 is memory loc
21cf0 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62  ation iBMem+0, b
21d00 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e  1 is iBMem+1, an
21d10 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20  d so forth).    
21d20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72    ** Then compar
21d30 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
21d40 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61  OUP BY terms aga
21d50 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42  inst the GROUP B
21d60 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a  Y terms.      **
21d70 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
21d80 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  us row currently
21d90 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61   stored in a0, a
21da0 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, a2....      *
21db0 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f  /.      addrTopO
21dc0 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
21dd0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
21de0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
21df0 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; j<pGroupBy->nE
21e00 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
21e10 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
21e20 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rt ){.          
21e30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21e40 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
21e50 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
21e60 49 64 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29  Idx, j, iBMem+j)
21e70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
21e80 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
21e90 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d  nfo.directMode =
21ea0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   1;.          sq
21eb0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
21ec0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
21ed0 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65  a[j].pExpr, iBMe
21ee0 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  m+j);.        }.
21ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
21f00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
21f10 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69  v, OP_Compare, i
21f20 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72  AMem, iBMem, pGr
21f30 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20  oupBy->nExpr,.  
21f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f50 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
21f60 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
21f70 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d  NFO);.      j1 =
21f80 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
21f90 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
21fa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21fb0 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
21fc0 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a  j1+1, 0, j1+1);.
21fd0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
21fe0 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e  te code that run
21ff0 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47  s whenever the G
22000 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e  ROUP BY changes.
22010 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65  .      ** Change
22020 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42  s in the GROUP B
22030 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62  Y are detected b
22040 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  y the previous c
22050 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  ode.      ** blo
22060 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65  ck.  If there we
22070 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74  re no changes, t
22080 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69  his block is ski
22090 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  pped..      **. 
220a0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64       ** This cod
220b0 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74  e copies current
220c0 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20   group by terms 
220d0 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a  in b0,b1,b2,....
220e0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f        ** over to
220f0 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74   a0,a1,a2.  It t
22100 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75  hen calls the ou
22110 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a  tput subroutine.
22120 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
22130 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74  ets the aggregat
22140 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
22150 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61  gisters in prepa
22160 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ration.      ** 
22170 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f  for the next GRO
22180 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20  UP BY batch..   
22190 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
221a0 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
221b0 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69  pParse, iBMem, i
221c0 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  AMem, pGroupBy->
221d0 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  nExpr);.      sq
221e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
221f0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
22200 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
22210 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
22220 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
22230 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77   "output one row
22240 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
22250 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22260 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74  OP_IfPos, iAbort
22270 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a  Flag, addrEnd);.
22280 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
22290 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f  t((v, "check abo
222a0 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
222b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
222c0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
222d0 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
222e0 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  eset);.      Vdb
222f0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
22300 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22  set accumulator"
22310 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ));..      /* Up
22320 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61  date the aggrega
22330 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20  te accumulators 
22340 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
22350 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tent of.      **
22360 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
22370 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22380 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
22390 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
223a0 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
223b0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
223c0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
223d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
223e0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
223f0 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
22400 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
22410 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74  v, "indicate dat
22420 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72  a in accumulator
22430 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  "));..      /* E
22440 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  nd of the loop. 
22450 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
22460 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
22470 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22480 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22490 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e  _Next, sAggInfo.
224a0 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
224b0 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20  TopOfLoop);.    
224c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
224d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
224e0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
224f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
22500 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64  ngeToNoop(v, add
22510 72 53 6f 72 74 69 6e 67 49 64 78 2c 20 31 29 3b  rSortingIdx, 1);
22520 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
22530 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69  /* Output the fi
22540 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  nal row of resul
22550 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
22560 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22570 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
22580 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
22590 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
225a0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
225b0 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61  (v, "output fina
225c0 6c 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20  l row"));.      
225d0 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20  .    } /* endif 
225e0 70 47 72 6f 75 70 42 79 20 2a 2f 0a 20 20 20 20  pGroupBy */.    
225f0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70  else {.      Exp
22600 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d  rList *pMinMax =
22610 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69   0;.      ExprLi
22620 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 20 20  st *pDel = 0;.  
22630 20 20 20 20 75 38 20 66 6c 61 67 3b 0a 0a 20 20      u8 flag;..  
22640 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
22650 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20  the query is of 
22660 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
22670 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20  wing forms:.    
22680 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
22690 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52  SELECT min(x) FR
226a0 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  OM ....      ** 
226b0 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20    SELECT max(x) 
226c0 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 2a  FROM ....      *
226d0 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74  *.      ** If it
226e0 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68   is, then ask th
226f0 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  e code in where.
22700 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  c to attempt to 
22710 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20  sort results.   
22720 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72     ** as if ther
22730 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20  e was an "ORDER 
22740 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20  ON x" or "ORDER 
22750 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73  ON x DESC" claus
22760 65 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 66 20  e. .      ** If 
22770 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20  where.c is able 
22780 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c  to produce resul
22790 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69  ts sorted in thi
227a0 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20  s order, then.  
227b0 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20      ** add vdbe 
227c0 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  code to break ou
227d0 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73  t of the process
227e0 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74  ing loop after t
227f0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 72  he .      ** fir
22800 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69  st iteration (si
22810 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74  nce the first it
22820 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
22830 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  oop is .      **
22840 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f   guaranteed to o
22850 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f  perate on the ro
22860 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d  w with the minim
22870 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20  um or maximum . 
22880 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
22890 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77   x, the only row
228a0 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20   required)..    
228b0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 20    **.      ** A 
228c0 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73  special flag mus
228d0 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73  t be passed to s
228e0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
228f0 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20  () to slightly. 
22900 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62       ** modify b
22910 65 68 61 76 69 6f 75 72 20 61 73 20 66 6f 6c 6c  ehaviour as foll
22920 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ows:.      **.  
22930 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68      **   + If th
22940 65 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45  e query is a "SE
22950 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68  LECT min(x)", th
22960 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65  en the loop code
22970 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 20 20  d by.      **   
22980 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64    where.c should
22990 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65   not iterate ove
229a0 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74  r any values wit
229b0 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20  h a NULL value. 
229c0 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20       **     for 
229d0 78 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  x..      **.    
229e0 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74    **   + The opt
229f0 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77  imizer code in w
22a00 68 65 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e  here.c (the thin
22a10 67 20 74 68 61 74 20 64 65 63 69 64 65 73 20 77  g that decides w
22a20 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 20 20  hich.      **   
22a30 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63    index or indic
22a40 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c  es to use) shoul
22a50 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72  d place a differ
22a60 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20  ent priority on 
22a70 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61  .      **     sa
22a80 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52  tisfying the 'OR
22a90 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74  DER BY' clause t
22aa0 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f  han it does in o
22ab0 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20  ther cases..    
22ac0 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74    **     Refer t
22ad0 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65  o code and comme
22ae0 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66  nts in where.c f
22af0 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20  or details..    
22b00 20 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 20    */.      flag 
22b10 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 70 50  = minMaxQuery(pP
22b20 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
22b30 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20  if( flag ){.    
22b40 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d      pDel = pMinM
22b50 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ax = sqlite3Expr
22b60 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
22b70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
22b80 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  r->pList);.     
22b90 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26     if( pMinMax &
22ba0 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
22bb0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
22bc0 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73   pMinMax->a[0].s
22bd0 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21  ortOrder = flag!
22be0 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
22bf0 49 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d  IN;.          pM
22c00 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70  inMax->a[0].pExp
22c10 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
22c20 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  N;.        }.   
22c30 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54     }..      /* T
22c40 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66  his case runs if
22c50 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68   the aggregate h
22c60 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
22c70 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20  lause.  The.    
22c80 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
22c90 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20  is much simpler 
22ca0 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f  since there is o
22cb0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nly a single row
22cc0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74  .      ** of out
22cd0 70 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  put..      */.  
22ce0 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c      resetAccumul
22cf0 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
22d00 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70  ggInfo);.      p
22d10 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
22d20 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
22d30 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
22d40 72 65 2c 20 26 70 4d 69 6e 4d 61 78 2c 20 66 6c  re, &pMinMax, fl
22d50 61 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ag);.      if( p
22d60 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  WInfo==0 ){.    
22d70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
22d80 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
22d90 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  el);.        got
22da0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
22db0 20 20 20 20 7d 0a 20 20 20 20 20 20 75 70 64 61      }.      upda
22dc0 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
22dd0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
22de0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d 69  ;.      if( !pMi
22df0 6e 4d 61 78 20 26 26 20 66 6c 61 67 20 29 7b 0a  nMax && flag ){.
22e00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
22e10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22e20 47 6f 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d  Goto, 0, pWInfo-
22e30 3e 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20  >iBreak);.      
22e40 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
22e50 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78  , "%s() by index
22e60 22 2c 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f  ",(flag==WHERE_O
22e70 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22  RDERBY_MIN?"min"
22e80 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20  :"max")));.     
22e90 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
22ea0 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
22eb0 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
22ec0 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
22ed0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
22ee0 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
22ef0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
22f00 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
22f10 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
22f20 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
22f30 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53  ving, addrEnd, S
22f40 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
22f50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
22f60 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
22f70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
22f80 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  EList, 0, 0, 0, 
22f90 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  -1, .           
22fa0 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
22fb0 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45  , addrEnd, addrE
22fc0 6e 64 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  nd);..      sqli
22fd0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
22fe0 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20  e(db, pDel);.   
22ff0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
23000 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
23010 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
23020 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67  .  } /* endif ag
23030 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
23040 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
23050 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
23060 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e  lause, then we n
23070 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20  eed to sort the 
23080 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64  results.  ** and
23090 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68   send them to th
230a0 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62  e callback one b
230b0 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  y one..  */.  if
230c0 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
230d0 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
230e0 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c  il(pParse, p, v,
230f0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
23100 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  pDest);.  }..#if
23110 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23120 5f 53 55 42 51 55 45 52 59 0a 20 20 2f 2a 20 49  _SUBQUERY.  /* I
23130 66 20 74 68 69 73 20 77 61 73 20 61 20 73 75 62  f this was a sub
23140 71 75 65 72 79 2c 20 77 65 20 68 61 76 65 20 6e  query, we have n
23150 6f 77 20 63 6f 6e 76 65 72 74 65 64 20 74 68 65  ow converted the
23160 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 61   subquery into a
23170 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
23180 74 61 62 6c 65 2e 20 20 53 6f 20 73 65 74 20 74  table.  So set t
23190 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2e  he SrcList_item.
231a0 69 73 50 6f 70 75 6c 61 74 65 64 20 66 6c 61 67  isPopulated flag
231b0 20 74 6f 20 70 72 65 76 65 6e 74 0a 20 20 2a 2a   to prevent.  **
231c0 20 74 68 69 73 20 73 75 62 71 75 65 72 79 20 66   this subquery f
231d0 72 6f 6d 20 62 65 69 6e 67 20 65 76 61 6c 75 61  rom being evalua
231e0 74 65 64 20 61 67 61 69 6e 20 61 6e 64 20 74 6f  ted again and to
231f0 20 66 6f 72 63 65 20 74 68 65 20 75 73 65 20 6f   force the use o
23200 66 0a 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f  f.  ** the tempo
23210 72 61 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  rary table..  */
23220 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 29  .  if( pParent )
23230 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
23240 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72  arent->pSrc->nSr
23250 63 3e 70 61 72 65 6e 74 54 61 62 20 29 3b 0a 20  c>parentTab );. 
23260 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
23270 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65  nt->pSrc->a[pare
23280 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d  ntTab].pSelect==
23290 70 20 29 3b 0a 20 20 20 20 70 50 61 72 65 6e 74  p );.    pParent
232a0 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74  ->pSrc->a[parent
232b0 54 61 62 5d 2e 69 73 50 6f 70 75 6c 61 74 65 64  Tab].isPopulated
232c0 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 1;.  }.#endif
232d0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
232e0 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75   to skip this qu
232f0 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
23300 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
23310 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20  el(v, iEnd);..  
23320 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61  /* The SELECT wa
23330 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
23340 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20  oded.   Set the 
23350 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30  return code to 0
23360 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
23370 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a  e no errors..  *
23380 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f  /.  rc = 0;..  /
23390 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20  * Control jumps 
233a0 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72  to here if an er
233b0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
233c0 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f  ed above, or upo
233d0 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75  n.  ** successfu
233e0 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  l coding of the 
233f0 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c  SELECT..  */.sel
23400 65 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49  ect_end:..  /* I
23410 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e  dentify column n
23420 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20  ames if we will 
23430 62 65 20 75 73 69 6e 67 20 74 68 65 6d 20 69 6e  be using them in
23440 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68   a callback.  Th
23450 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20  is.  ** step is 
23460 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f  skipped if the o
23470 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74  utput is going t
23480 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 64 65 73  o some other des
23490 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  tination..  */. 
234a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
234b0 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65  OK && pDest->eDe
234c0 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
234d0 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
234e0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
234f0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
23500 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  List);.  }..  sq
23510 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
23520 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a  sAggInfo.aCol);.
23530 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
23540 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  db, sAggInfo.aFu
23550 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nc);.  return rc
23560 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
23570 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
23580 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
23590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
235a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
235b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
235c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
235d0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
235e0 6e 67 20 63 6f 64 65 20 69 73 20 75 73 65 64 20  ng code is used 
235f0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
23600 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20  debugging only. 
23610 20 54 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68 61   The code.** tha
23620 74 20 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20 6e  t follows does n
23630 6f 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72  ot appear in nor
23640 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a  mal builds..**.*
23650 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
23660 20 61 72 65 20 75 73 65 64 20 74 6f 20 70 72 69   are used to pri
23670 6e 74 20 6f 75 74 20 74 68 65 20 63 6f 6e 74 65  nt out the conte
23680 6e 74 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61 72  nt of all or par
23690 74 20 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73 65  t of a .** parse
236a0 20 73 74 72 75 63 74 75 72 65 73 20 73 75 63 68   structures such
236b0 20 61 73 20 53 65 6c 65 63 74 20 6f 72 20 45 78   as Select or Ex
236c0 70 72 2e 20 20 53 75 63 68 20 70 72 69 6e 74 6f  pr.  Such printo
236d0 75 74 73 20 61 72 65 20 75 73 65 66 75 6c 0a 2a  uts are useful.*
236e0 2a 20 66 6f 72 20 68 65 6c 70 69 6e 67 20 74 6f  * for helping to
236f0 20 75 6e 64 65 72 73 74 61 6e 64 20 77 68 61 74   understand what
23700 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 69 6e   is happening in
23710 73 69 64 65 20 74 68 65 20 63 6f 64 65 20 67 65  side the code ge
23720 6e 65 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69 6e  nerator.** durin
23730 67 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20  g the execution 
23740 6f 66 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45 43  of complex SELEC
23750 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  T statements..**
23760 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
23770 65 20 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64  e are not called
23780 20 61 6e 79 77 68 65 72 65 20 66 72 6f 6d 20 77   anywhere from w
23790 69 74 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61 6c  ithin the normal
237a0 0a 2a 2a 20 63 6f 64 65 20 62 61 73 65 2e 20 20  .** code base.  
237b0 54 68 65 6e 20 61 72 65 20 69 6e 74 65 6e 64 65  Then are intende
237c0 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66  d to be called f
237d0 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 64  rom within the d
237e0 65 62 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66 72  ebugger.** or fr
237f0 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20 22 70 72  om temporary "pr
23800 69 6e 74 66 22 20 73 74 61 74 65 6d 65 6e 74 73  intf" statements
23810 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20 64 65   inserted for de
23820 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64  bugging..*/.void
23830 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
23840 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  r(Expr *p){.  if
23850 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20  ( p->token.z && 
23860 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30 20 29 7b 0a  p->token.n>0 ){.
23870 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23880 50 72 69 6e 74 66 28 22 28 25 2e 2a 73 22 2c 20  Printf("(%.*s", 
23890 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e 74  p->token.n, p->t
238a0 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65  oken.z);.  }else
238b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
238c0 75 67 50 72 69 6e 74 66 28 22 28 25 64 22 2c 20  ugPrintf("(%d", 
238d0 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20 69 66  p->op);.  }.  if
238e0 28 20 70 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  ( p->pLeft ){.  
238f0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23900 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73  intf(" ");.    s
23910 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
23920 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20  p->pLeft);.  }. 
23930 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29   if( p->pRight )
23940 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
23950 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20  ugPrintf(" ");. 
23960 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
23970 78 70 72 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a  xpr(p->pRight);.
23980 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62    }.  sqlite3Deb
23990 75 67 50 72 69 6e 74 66 28 22 29 22 29 3b 0a 7d  ugPrintf(")");.}
239a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69  .void sqlite3Pri
239b0 6e 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  ntExprList(ExprL
239c0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
239d0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
239e0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
239f0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
23a00 65 33 50 72 69 6e 74 45 78 70 72 28 70 4c 69 73  e3PrintExpr(pLis
23a10 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
23a20 20 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d      if( i<pList-
23a30 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20  >nExpr-1 ){.    
23a40 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23a50 69 6e 74 66 28 22 2c 20 22 29 3b 0a 20 20 20 20  intf(", ");.    
23a60 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  }.  }.}.void sql
23a70 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28  ite3PrintSelect(
23a80 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
23a90 6e 64 65 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65  ndent){.  sqlite
23aa0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
23ab0 73 53 45 4c 45 43 54 28 25 70 29 20 22 2c 20 69  sSELECT(%p) ", i
23ac0 6e 64 65 6e 74 2c 20 22 22 2c 20 70 29 3b 0a 20  ndent, "", p);. 
23ad0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
23ae0 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 29  rList(p->pEList)
23af0 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
23b00 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
23b10 69 66 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20  if( p->pSrc ){. 
23b20 20 20 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78     char *zPrefix
23b30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
23b40 20 7a 50 72 65 66 69 78 20 3d 20 22 46 52 4f 4d   zPrefix = "FROM
23b50 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ";.    for(i=0; 
23b60 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b  i<p->pSrc->nSrc;
23b70 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
23b80 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
23b90 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53   *pItem = &p->pS
23ba0 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
23bb0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23bc0 74 66 28 22 25 2a 73 20 22 2c 20 69 6e 64 65 6e  tf("%*s ", inden
23bd0 74 2b 36 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20  t+6, zPrefix);. 
23be0 20 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22       zPrefix = "
23bf0 22 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ";.      if( pIt
23c00 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
23c10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
23c20 62 75 67 50 72 69 6e 74 66 28 22 28 5c 6e 22 29  bugPrintf("(\n")
23c30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
23c40 33 50 72 69 6e 74 53 65 6c 65 63 74 28 70 49 74  3PrintSelect(pIt
23c50 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 6e 64  em->pSelect, ind
23c60 65 6e 74 2b 31 30 29 3b 0a 20 20 20 20 20 20 20  ent+10);.       
23c70 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23c80 6e 74 66 28 22 25 2a 73 29 22 2c 20 69 6e 64 65  ntf("%*s)", inde
23c90 6e 74 2b 38 2c 20 22 22 29 3b 0a 20 20 20 20 20  nt+8, "");.     
23ca0 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 6d   }else if( pItem
23cb0 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ->zName ){.     
23cc0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
23cd0 72 69 6e 74 66 28 22 25 73 22 2c 20 70 49 74 65  rintf("%s", pIte
23ce0 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m->zName);.     
23cf0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74   }.      if( pIt
23d00 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20  em->pTab ){.    
23d10 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23d20 50 72 69 6e 74 66 28 22 28 74 61 62 6c 65 3a 20  Printf("(table: 
23d30 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  %s)", pItem->pTa
23d40 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
23d50 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74   }.      if( pIt
23d60 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  em->zAlias ){.  
23d70 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
23d80 75 67 50 72 69 6e 74 66 28 22 20 41 53 20 25 73  ugPrintf(" AS %s
23d90 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  ", pItem->zAlias
23da0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
23db0 20 69 66 28 20 69 3c 70 2d 3e 70 53 72 63 2d 3e   if( i<p->pSrc->
23dc0 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20 20 20 20  nSrc-1 ){.      
23dd0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23de0 69 6e 74 66 28 22 2c 22 29 3b 0a 20 20 20 20 20  intf(",");.     
23df0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
23e00 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
23e10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
23e20 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a  f( p->pWhere ){.
23e30 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23e40 50 72 69 6e 74 66 28 22 25 2a 73 20 57 48 45 52  Printf("%*s WHER
23e50 45 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29  E ", indent, "")
23e60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
23e70 6e 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  ntExpr(p->pWhere
23e80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
23e90 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
23ea0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47  .  }.  if( p->pG
23eb0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71  roupBy ){.    sq
23ec0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23ed0 28 22 25 2a 73 20 47 52 4f 55 50 20 42 59 20 22  ("%*s GROUP BY "
23ee0 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20  , indent, "");. 
23ef0 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
23f00 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
23f10 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBy);.    sqlite
23f20 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
23f30 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ");.  }.  if( p-
23f40 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20  >pHaving ){.    
23f50 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23f60 74 66 28 22 25 2a 73 20 48 41 56 49 4e 47 20 22  tf("%*s HAVING "
23f70 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20  , indent, "");. 
23f80 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
23f90 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b  xpr(p->pHaving);
23fa0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
23fb0 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
23fc0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64   }.  if( p->pOrd
23fd0 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
23fe0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23ff0 25 2a 73 20 4f 52 44 45 52 20 42 59 20 22 2c 20  %*s ORDER BY ", 
24000 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20  indent, "");.   
24010 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
24020 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
24030 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  y);.    sqlite3D
24040 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
24050 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f  ;.  }.}./* End o
24060 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  f the structure 
24070 64 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63  debug printing c
24080 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ode.************
24090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
240a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
240b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
240c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
240d0 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  */.#endif /* def
240e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
240f0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
24100 49 54 45 5f 44 45 42 55 47 29 20 2a 2f 0a        ITE_DEBUG) */.