/ Hex Artifact Content
Login

Artifact bd494b68a54a51de3df94ecdd6d24fa7598929d1:


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 35 30 36  select.c,v 1.506
0200: 20 32 30 30 39 2f 30 33 2f 33 31 20 30 33 3a 34   2009/03/31 03:4
0210: 31 3a 35 37 20 73 68 61 6e 65 20 45 78 70 20 24  1:57 shane Exp $
0220: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0230: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a  liteInt.h".../*.
0240: 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68  ** Delete all th
0250: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53  e content of a S
0260: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0270: 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 61 6c 6c  but do not deall
0280: 6f 63 61 74 65 0a 2a 2a 20 74 68 65 20 73 65 6c  ocate.** the sel
0290: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 69 74  ect structure it
02a0: 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  self..*/.static 
02b0: 76 6f 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74  void clearSelect
02c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
02d0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c 69  lect *p){.  sqli
02e0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
02f0: 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29  e(db, p->pEList)
0300: 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  ;.  sqlite3SrcLi
0310: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
0320: 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  pSrc);.  sqlite3
0330: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
0340: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 73 71 6c  ->pWhere);.  sql
0350: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
0360: 74 65 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  te(db, p->pGroup
0370: 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  By);.  sqlite3Ex
0380: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
0390: 70 48 61 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69  pHaving);.  sqli
03a0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
03b0: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
03c0: 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  y);.  sqlite3Sel
03d0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
03e0: 3e 70 50 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69  >pPrior);.  sqli
03f0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
0400: 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
0410: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
0420: 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74  e(db, p->pOffset
0430: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
0440: 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63 74 44  ialize a SelectD
0450: 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  est structure..*
0460: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
0470: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53 65 6c  lectDestInit(Sel
0480: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
0490: 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69  int eDest, int i
04a0: 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e  Parm){.  pDest->
04b0: 65 44 65 73 74 20 3d 20 28 75 38 29 65 44 65 73  eDest = (u8)eDes
04c0: 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 50 61 72  t;.  pDest->iPar
04d0: 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20 70 44 65  m = iParm;.  pDe
04e0: 73 74 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 30  st->affinity = 0
04f0: 3b 0a 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20  ;.  pDest->iMem 
0500: 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 4d  = 0;.  pDest->nM
0510: 65 6d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  em = 0;.}.../*.*
0520: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
0530: 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
0540: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  e and return a p
0550: 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a  ointer to that.*
0560: 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  * structure..*/.
0570: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
0580: 65 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73  electNew(.  Pars
0590: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
05a0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
05b0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
05c0: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
05d0: 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  /* which columns
05e0: 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74   to include in t
05f0: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53  he result */.  S
0600: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
0610: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
0620: 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68   clause -- which
0630: 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20   tables to scan 
0640: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
0650: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  e,         /* th
0660: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
0670: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
0680: 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65  roupBy,   /* the
0690: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
06a0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
06b0: 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74  ing,        /* t
06c0: 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
06d0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
06e0: 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74  pOrderBy,   /* t
06f0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
0700: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69  se */.  int isDi
0710: 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f 2a  stinct,       /*
0720: 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53   true if the DIS
0730: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
0740: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 45 78   present */.  Ex
0750: 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20 20  pr *pLimit,     
0760: 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c      /* LIMIT val
0770: 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20  ue.  NULL means 
0780: 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45 78  not used */.  Ex
0790: 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20 20  pr *pOffset     
07a0: 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61      /* OFFSET va
07b0: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
07c0: 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b   no offset */.){
07d0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b  .  Select *pNew;
07e0: 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64 69  .  Select standi
07f0: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n;.  sqlite3 *db
0800: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
0810: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
0820: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
0830: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
0840: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d  .  assert( db->m
0850: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 21  allocFailed || !
0860: 70 4f 66 66 73 65 74 20 7c 7c 20 70 4c 69 6d 69  pOffset || pLimi
0870: 74 20 29 3b 20 2f 2a 20 4f 46 46 53 45 54 20 69  t ); /* OFFSET i
0880: 6d 70 6c 69 65 73 20 4c 49 4d 49 54 20 2a 2f 0a  mplies LIMIT */.
0890: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
08a0: 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61  .    pNew = &sta
08b0: 6e 64 69 6e 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ndin;.    memset
08c0: 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (pNew, 0, sizeof
08d0: 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20 20  (*pNew));.  }.  
08e0: 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b  if( pEList==0 ){
08f0: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71  .    pEList = sq
0900: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
0910: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
0920: 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 54 4b  qlite3Expr(db,TK
0930: 5f 41 4c 4c 2c 30 2c 30 2c 30 29 2c 20 30 29 3b  _ALL,0,0,0), 0);
0940: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
0950: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
0960: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72  pNew->pSrc = pSr
0970: 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  c;.  pNew->pWher
0980: 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e  e = pWhere;.  pN
0990: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70  ew->pGroupBy = p
09a0: 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d  GroupBy;.  pNew-
09b0: 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69  >pHaving = pHavi
09c0: 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64  ng;.  pNew->pOrd
09d0: 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
09e0: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67  .  pNew->selFlag
09f0: 73 20 3d 20 69 73 44 69 73 74 69 6e 63 74 20 3f  s = isDistinct ?
0a00: 20 53 46 5f 44 69 73 74 69 6e 63 74 20 3a 20 30   SF_Distinct : 0
0a10: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54  ;.  pNew->op = T
0a20: 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77  K_SELECT;.  pNew
0a30: 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
0a40: 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  t;.  pNew->pOffs
0a50: 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
0a60: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0a70: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
0a80: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0a90: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
0aa0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
0ab0: 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62  ] = -1;.  if( db
0ac0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
0ad0: 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65   {.    clearSele
0ae0: 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ct(db, pNew);.  
0af0: 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73 74 61    if( pNew!=&sta
0b00: 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33 44 62  ndin ) sqlite3Db
0b10: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
0b20: 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
0b30: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
0b40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
0b50: 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63   the given Selec
0b60: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0b70: 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74  all of its subst
0b80: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
0b90: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
0ba0: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
0bb0: 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  b, Select *p){. 
0bc0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 6c   if( p ){.    cl
0bd0: 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70 29  earSelect(db, p)
0be0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
0bf0: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
0c00: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31  }../*.** Given 1
0c10: 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72   to 3 identifier
0c20: 73 20 70 72 65 63 65 65 64 69 6e 67 20 74 68 65  s preceeding the
0c30: 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64   JOIN keyword, d
0c40: 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20  etermine the.** 
0c50: 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52  type of join.  R
0c60: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
0c70: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65   constant that e
0c80: 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79  xpresses that ty
0c90: 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f  pe.** in terms o
0ca0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0cb0: 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  bit values:.**.*
0cc0: 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a  *     JT_INNER.*
0cd0: 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a  *     JT_CROSS.*
0ce0: 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a  *     JT_OUTER.*
0cf0: 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c  *     JT_NATURAL
0d00: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a  .**     JT_LEFT.
0d10: 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a  **     JT_RIGHT.
0d20: 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74  **.** A full out
0d30: 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63  er join is the c
0d40: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54  ombination of JT
0d50: 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47  _LEFT and JT_RIG
0d60: 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  HT..**.** If an 
0d70: 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70  illegal or unsup
0d80: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
0d90: 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73   is seen, then s
0da0: 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61  till return.** a
0db0: 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20   join type, but 
0dc0: 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  put an error in 
0dd0: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
0de0: 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
0df0: 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72  ite3JoinType(Par
0e00: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
0e10: 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42  n *pA, Token *pB
0e20: 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20  , Token *pC){.  
0e30: 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30  int jointype = 0
0e40: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c  ;.  Token *apAll
0e50: 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b  [3];.  Token *p;
0e60: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
0e70: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e  struct {.    con
0e80: 73 74 20 63 68 61 72 20 7a 4b 65 79 77 6f 72 64  st char zKeyword
0e90: 5b 38 5d 3b 0a 20 20 20 20 75 38 20 6e 43 68 61  [8];.    u8 nCha
0ea0: 72 3b 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 0a  r;.    u8 code;.
0eb0: 20 20 7d 20 6b 65 79 77 6f 72 64 73 5b 5d 20 3d    } keywords[] =
0ec0: 20 7b 0a 20 20 20 20 7b 20 22 6e 61 74 75 72 61   {.    { "natura
0ed0: 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41  l", 7, JT_NATURA
0ee0: 4c 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65 66 74  L },.    { "left
0ef0: 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46 54  ",    4, JT_LEFT
0f00: 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20  |JT_OUTER },.   
0f10: 20 7b 20 22 72 69 67 68 74 22 2c 20 20 20 35 2c   { "right",   5,
0f20: 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54   JT_RIGHT|JT_OUT
0f30: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75 6c  ER },.    { "ful
0f40: 6c 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45 46  l",    4, JT_LEF
0f50: 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  T|JT_RIGHT|JT_OU
0f60: 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 75  TER },.    { "ou
0f70: 74 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 4f 55  ter",   5, JT_OU
0f80: 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e  TER },.    { "in
0f90: 6e 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e  ner",   5, JT_IN
0fa0: 4e 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 63 72  NER },.    { "cr
0fb0: 6f 73 73 22 2c 20 20 20 35 2c 20 4a 54 5f 49 4e  oss",   5, JT_IN
0fc0: 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 7d 2c 0a  NER|JT_CROSS },.
0fd0: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b    };.  int i, j;
0fe0: 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41  .  apAll[0] = pA
0ff0: 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70  ;.  apAll[1] = p
1000: 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20  B;.  apAll[2] = 
1010: 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  pC;.  for(i=0; i
1020: 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20  <3 && apAll[i]; 
1030: 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70  i++){.    p = ap
1040: 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28  All[i];.    for(
1050: 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65  j=0; j<ArraySize
1060: 28 6b 65 79 77 6f 72 64 73 29 3b 20 6a 2b 2b 29  (keywords); j++)
1070: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  {.      if( p->n
1080: 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 6e 43  ==keywords[j].nC
1090: 68 61 72 20 0a 20 20 20 20 20 20 20 20 20 20 26  har .          &
10a0: 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
10b0: 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 6b  p((char*)p->z, k
10c0: 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b 65 79 77  eywords[j].zKeyw
10d0: 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b  ord, p->n)==0 ){
10e0: 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  .        jointyp
10f0: 65 20 7c 3d 20 6b 65 79 77 6f 72 64 73 5b 6a 5d  e |= keywords[j]
1100: 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 62  .code;.        b
1110: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1120: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41    }.    if( j>=A
1130: 72 72 61 79 53 69 7a 65 28 6b 65 79 77 6f 72 64  rraySize(keyword
1140: 73 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e  s) ){.      join
1150: 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52  type |= JT_ERROR
1160: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1170: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20     }.  }.  if(. 
1180: 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20      (jointype & 
1190: 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54  (JT_INNER|JT_OUT
11a0: 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c  ER))==(JT_INNER|
11b0: 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20  JT_OUTER) ||.   
11c0: 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54    (jointype & JT
11d0: 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a  _ERROR)!=0.  ){.
11e0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11f0: 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61  zSp = " ";.    a
1200: 73 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a  ssert( pB!=0 );.
1210: 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b      if( pC==0 ){
1220: 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71   zSp++; }.    sq
1230: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1240: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f  arse, "unknown o
1250: 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f  r unsupported jo
1260: 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20  in type: ".     
1270: 20 20 22 25 54 20 25 54 25 73 25 54 22 2c 20 70    "%T %T%s%T", p
1280: 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b  A, pB, zSp, pC);
1290: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
12a0: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73  JT_INNER;.  }els
12b0: 65 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20 26  e if( jointype &
12c0: 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20 20   JT_RIGHT ){.   
12d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12e0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
12f0: 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20  "RIGHT and FULL 
1300: 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20  OUTER JOINs are 
1310: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75  not currently su
1320: 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a  pported");.    j
1330: 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e  ointype = JT_INN
1340: 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
1350: 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a   jointype;.}../*
1360: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
1370: 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  ndex of a column
1380: 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65   in a table.  Re
1390: 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63  turn -1 if the c
13a0: 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20  olumn.** is not 
13b0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
13c0: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
13d0: 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65  c int columnInde
13e0: 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  x(Table *pTab, c
13f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29  onst char *zCol)
1400: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1410: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
1420: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
1430: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1440: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (pTab->aCol[i].z
1450: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
1460: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
1470: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
1480: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
1490: 75 65 20 6f 66 20 61 20 74 6f 6b 65 6e 20 74 6f  ue of a token to
14a0: 20 61 20 27 5c 30 30 30 27 2d 74 65 72 6d 69 6e   a '\000'-termin
14b0: 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  ated string..*/.
14c0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 54  static void setT
14d0: 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20 63  oken(Token *p, c
14e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
14f0: 20 70 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a 3b 0a   p->z = (u8*)z;.
1500: 20 20 70 2d 3e 6e 20 3d 20 7a 20 3f 20 73 71 6c    p->n = z ? sql
1510: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20  ite3Strlen30(z) 
1520: 3a 20 30 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d 20  : 0;.  p->dyn = 
1530: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
1540: 74 68 65 20 74 6f 6b 65 6e 20 74 6f 20 74 68 65  the token to the
1550: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 61   double-quoted a
1560: 6e 64 20 65 73 63 61 70 65 64 20 76 65 72 73 69  nd escaped versi
1570: 6f 6e 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  on of the string
1580: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
1590: 79 20 7a 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  y z. For example
15a0: 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 7b 61 22 62 63  ;.**.**    {a"bc
15b0: 7d 20 20 2d 3e 20 20 7b 22 61 22 22 62 63 22 7d  }  ->  {"a""bc"}
15c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15d0: 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28 50  setQuotedToken(P
15e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
15f0: 6b 65 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ken *p, const ch
1600: 61 72 20 2a 7a 29 7b 0a 0a 20 20 2f 2a 20 43 68  ar *z){..  /* Ch
1610: 65 63 6b 20 69 66 20 74 68 65 20 73 74 72 69 6e  eck if the strin
1620: 67 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  g appears to be 
1630: 71 75 6f 74 65 64 20 75 73 69 6e 67 20 22 2e 2e  quoted using "..
1640: 2e 22 20 6f 72 20 60 2e 2e 2e 60 0a 20 20 2a 2a  ." or `...`.  **
1650: 20 6f 72 20 5b 2e 2e 2e 5d 20 6f 72 20 27 2e 2e   or [...] or '..
1660: 2e 27 20 6f 72 20 69 66 20 74 68 65 20 73 74 72  .' or if the str
1670: 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  ing contains any
1680: 20 22 20 63 68 61 72 61 63 74 65 72 73 2e 20 20   " characters.  
1690: 0a 20 20 2a 2a 20 49 66 20 69 74 20 64 6f 65 73  .  ** If it does
16a0: 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20  , then record a 
16b0: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73  version of the s
16c0: 74 72 69 6e 67 20 77 69 74 68 20 74 68 65 20 73  tring with the s
16d0: 70 65 63 69 61 6c 0a 20 20 2a 2a 20 63 68 61 72  pecial.  ** char
16e0: 61 63 74 65 72 73 20 65 73 63 61 70 65 64 2e 0a  acters escaped..
16f0: 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61    */.  const cha
1700: 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20 69 66 28  r *z2 = z;.  if(
1710: 20 2a 7a 32 21 3d 27 5b 27 20 26 26 20 2a 7a 32   *z2!='[' && *z2
1720: 21 3d 27 60 27 20 26 26 20 2a 7a 32 21 3d 27 5c  !='`' && *z2!='\
1730: 27 27 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  '' ){.    while(
1740: 20 2a 7a 32 20 29 7b 0a 20 20 20 20 20 20 69 66   *z2 ){.      if
1750: 28 20 2a 7a 32 3d 3d 27 22 27 20 29 20 62 72 65  ( *z2=='"' ) bre
1760: 61 6b 3b 0a 20 20 20 20 20 20 7a 32 2b 2b 3b 0a  ak;.      z2++;.
1770: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1780: 20 2a 7a 32 20 29 7b 0a 20 20 20 20 2f 2a 20 53   *z2 ){.    /* S
1790: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 22  tring contains "
17a0: 20 63 68 61 72 61 63 74 65 72 73 20 2d 20 63 6f   characters - co
17b0: 70 79 20 61 6e 64 20 71 75 6f 74 65 20 74 68 65  py and quote the
17c0: 20 73 74 72 69 6e 67 2e 20 2a 2f 0a 20 20 20 20   string. */.    
17d0: 70 2d 3e 7a 20 3d 20 28 75 38 20 2a 29 73 71 6c  p->z = (u8 *)sql
17e0: 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
17f0: 73 65 2d 3e 64 62 2c 20 22 5c 22 25 77 5c 22 22  se->db, "\"%w\""
1800: 2c 20 7a 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  , z);.    if( p-
1810: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  >z ){.      p->n
1820: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1830: 33 30 28 28 63 68 61 72 20 2a 29 70 2d 3e 7a 29  30((char *)p->z)
1840: 3b 0a 20 20 20 20 20 20 70 2d 3e 64 79 6e 20 3d  ;.      p->dyn =
1850: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
1860: 65 7b 0a 20 20 20 20 2f 2a 20 53 74 72 69 6e 67  e{.    /* String
1870: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 22 20 63   contains no " c
1880: 68 61 72 61 63 74 65 72 73 20 2d 20 63 6f 70 79  haracters - copy
1890: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 20 2a 2f   the pointer. */
18a0: 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 28 75 38 2a  .    p->z = (u8*
18b0: 29 7a 3b 0a 20 20 20 20 70 2d 3e 6e 20 3d 20 28  )z;.    p->n = (
18c0: 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 20 20  int)(z2 - z);.  
18d0: 20 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a 20 20    p->dyn = 0;.  
18e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  }.}../*.** Creat
18f0: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
1900: 6e 6f 64 65 20 66 6f 72 20 61 6e 20 69 64 65 6e  node for an iden
1910: 74 69 66 69 65 72 20 77 69 74 68 20 74 68 65 20  tifier with the 
1920: 6e 61 6d 65 20 6f 66 20 7a 4e 61 6d 65 0a 2a 2f  name of zName.*/
1930: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 43 72  .Expr *sqlite3Cr
1940: 65 61 74 65 49 64 45 78 70 72 28 50 61 72 73 65  eateIdExpr(Parse
1950: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
1960: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
1970: 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 73  Token dummy;.  s
1980: 65 74 54 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20  etToken(&dummy, 
1990: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
19a0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
19b0: 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20  arse, TK_ID, 0, 
19c0: 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 7d 0a 0a 2f  0, &dummy);.}../
19d0: 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20  *.** Add a term 
19e0: 74 6f 20 74 68 65 20 57 48 45 52 45 20 65 78 70  to the WHERE exp
19f0: 72 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78  ression in *ppEx
1a00: 70 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73  pr that requires
1a10: 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c   the.** zCol col
1a20: 75 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20  umn to be equal 
1a30: 69 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  in the two table
1a40: 73 20 70 54 61 62 31 20 61 6e 64 20 70 54 61 62  s pTab1 and pTab
1a50: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
1a60: 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a  d addWhereTerm(.
1a70: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1a80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1a90: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1aa0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1ab0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Col,        /* N
1ac0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
1ad0: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62  n */.  const Tab
1ae0: 6c 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20  le *pTab1,      
1af0: 2f 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a  /* First table *
1b00: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1b10: 7a 41 6c 69 61 73 31 2c 20 20 20 20 20 2f 2a 20  zAlias1,     /* 
1b20: 41 6c 69 61 73 20 66 6f 72 20 66 69 72 73 74 20  Alias for first 
1b30: 74 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e  table.  May be N
1b40: 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54  ULL */.  const T
1b50: 61 62 6c 65 20 2a 70 54 61 62 32 2c 20 20 20 20  able *pTab2,    
1b60: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c    /* Second tabl
1b70: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1b80: 72 20 2a 7a 41 6c 69 61 73 32 2c 20 20 20 20 20  r *zAlias2,     
1b90: 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 73 65 63  /* Alias for sec
1ba0: 6f 6e 64 20 74 61 62 6c 65 2e 20 20 4d 61 79 20  ond table.  May 
1bb0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
1bc0: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
1bd0: 2c 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75  ,     /* VDBE cu
1be0: 72 73 6f 72 20 66 6f 72 20 74 68 65 20 72 69 67  rsor for the rig
1bf0: 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  ht table */.  Ex
1c00: 70 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20  pr **ppExpr,    
1c10: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1c20: 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
1c30: 74 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69  to this expressi
1c40: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75  on */.  int isOu
1c50: 74 65 72 4a 6f 69 6e 20 20 20 20 20 20 20 20 20  terJoin         
1c60: 20 2f 2a 20 54 72 75 65 20 69 66 20 64 65 61 6c   /* True if deal
1c70: 69 6e 67 20 77 69 74 68 20 61 6e 20 4f 55 54 45  ing with an OUTE
1c80: 52 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 45  R join */.){.  E
1c90: 78 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62  xpr *pE1a, *pE1b
1ca0: 2c 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20  , *pE1c;.  Expr 
1cb0: 2a 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70  *pE2a, *pE2b, *p
1cc0: 45 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b  E2c;.  Expr *pE;
1cd0: 0a 0a 20 20 70 45 31 61 20 3d 20 73 71 6c 69 74  ..  pE1a = sqlit
1ce0: 65 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70  e3CreateIdExpr(p
1cf0: 50 61 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20  Parse, zCol);.  
1d00: 70 45 32 61 20 3d 20 73 71 6c 69 74 65 33 43 72  pE2a = sqlite3Cr
1d10: 65 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73  eateIdExpr(pPars
1d20: 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20  e, zCol);.  if( 
1d30: 7a 41 6c 69 61 73 31 3d 3d 30 20 29 7b 0a 20 20  zAlias1==0 ){.  
1d40: 20 20 7a 41 6c 69 61 73 31 20 3d 20 70 54 61 62    zAlias1 = pTab
1d50: 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20  1->zName;.  }.  
1d60: 70 45 31 62 20 3d 20 73 71 6c 69 74 65 33 43 72  pE1b = sqlite3Cr
1d70: 65 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73  eateIdExpr(pPars
1d80: 65 2c 20 7a 41 6c 69 61 73 31 29 3b 0a 20 20 69  e, zAlias1);.  i
1d90: 66 28 20 7a 41 6c 69 61 73 32 3d 3d 30 20 29 7b  f( zAlias2==0 ){
1da0: 0a 20 20 20 20 7a 41 6c 69 61 73 32 20 3d 20 70  .    zAlias2 = p
1db0: 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d  Tab2->zName;.  }
1dc0: 0a 20 20 70 45 32 62 20 3d 20 73 71 6c 69 74 65  .  pE2b = sqlite
1dd0: 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70 50  3CreateIdExpr(pP
1de0: 61 72 73 65 2c 20 7a 41 6c 69 61 73 32 29 3b 0a  arse, zAlias2);.
1df0: 20 20 70 45 31 63 20 3d 20 73 71 6c 69 74 65 33    pE1c = sqlite3
1e00: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
1e10: 5f 44 4f 54 2c 20 70 45 31 62 2c 20 70 45 31 61  _DOT, pE1b, pE1a
1e20: 2c 20 30 29 3b 0a 20 20 70 45 32 63 20 3d 20 73  , 0);.  pE2c = s
1e30: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
1e40: 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 32 62  se, TK_DOT, pE2b
1e50: 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45  , pE2a, 0);.  pE
1e60: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
1e70: 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70  pParse, TK_EQ, p
1e80: 45 31 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20  E1c, pE2c, 0);. 
1e90: 20 69 66 28 20 70 45 20 26 26 20 69 73 4f 75 74   if( pE && isOut
1ea0: 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78  erJoin ){.    Ex
1eb0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
1ec0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
1ed0: 20 20 20 20 70 45 2d 3e 69 52 69 67 68 74 4a 6f      pE->iRightJo
1ee0: 69 6e 54 61 62 6c 65 20 3d 20 69 52 69 67 68 74  inTable = iRight
1ef0: 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 20  JoinTable;.  }. 
1f00: 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74   *ppExpr = sqlit
1f10: 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
1f20: 2d 3e 64 62 2c 2a 70 70 45 78 70 72 2c 20 70 45  ->db,*ppExpr, pE
1f30: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
1f40: 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  the EP_FromJoin 
1f50: 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20  property on all 
1f60: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76  terms of the giv
1f70: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  en expression..*
1f80: 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78  * And set the Ex
1f90: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
1fa0: 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72  le to iTable for
1fb0: 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
1fc0: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
1fd0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46  ..**.** The EP_F
1fe0: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
1ff0: 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d   is used on term
2000: 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  s of an expressi
2010: 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68  on to tell.** th
2020: 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  e LEFT OUTER JOI
2030: 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  N processing log
2040: 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72  ic that this ter
2050: 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  m is part of the
2060: 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63  .** join restric
2070: 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69  tion specified i
2080: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
2090: 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74  G clause and not
20a0: 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68   a part.** of th
20b0: 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57  e more general W
20c0: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68  HERE clause.  Th
20d0: 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f  ese terms are mo
20e0: 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a  ved over to the.
20f0: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
2100: 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63  during join proc
2110: 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65  essing but we ne
2120: 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
2130: 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67  hat they.** orig
2140: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
2150: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2160: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72  ..**.** The Expr
2170: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
2180: 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45   tells the WHERE
2190: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
21a0: 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65  ng that the.** e
21b0: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64  xpression depend
21c0: 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68  s on table iRigh
21d0: 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20  tJoinTable even 
21e0: 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73  if that table is
21f0: 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74   not.** explicit
2200: 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  ly mentioned in 
2210: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
2220: 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f   That informatio
2230: 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66  n is needed.** f
2240: 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68  or cases like th
2250: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
2260: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
2270: 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
2280: 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78  .a=t2.b AND t1.x
2290: 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65  =5.**.** The whe
22a0: 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20  re clause needs 
22b0: 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  to defer the han
22c0: 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e  dling of the t1.
22d0: 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69  x=5.** term unti
22e0: 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c  l after the t2 l
22f0: 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  oop of the join.
2300: 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61    In that way, a
2310: 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20  .** NULL t2 row 
2320: 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
2330: 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d   whenever t1.x!=
2340: 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  5.  If we do not
2350: 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61  .** defer the ha
2360: 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35  ndling of t1.x=5
2370: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f  , it will be pro
2380: 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65  cessed immediate
2390: 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20  ly.** after the 
23a0: 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73  t1 loop and rows
23b0: 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69   with t1.x!=5 wi
23c0: 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20  ll never appear 
23d0: 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74  in.** the output
23e0: 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72  , which is incor
23f0: 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rect..*/.static 
2400: 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72  void setJoinExpr
2410: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54  (Expr *p, int iT
2420: 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20  able){.  while( 
2430: 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  p ){.    ExprSet
2440: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
2450: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 2d  romJoin);.    p-
2460: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
2470: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 73   = iTable;.    s
2480: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c  etJoinExpr(p->pL
2490: 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  eft, iTable);.  
24a0: 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b    p = p->pRight;
24b0: 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  .  } .}../*.** T
24c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63  his routine proc
24d0: 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69  esses the join i
24e0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
24f0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2500: 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49  t..** ON and USI
2510: 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63  NG clauses are c
2520: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78  onverted into ex
2530: 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tra terms of the
2540: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
2550: 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20  * NATURAL joins 
2560: 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72  also create extr
2570: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
2580: 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  erms..**.** The 
2590: 74 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20  terms of a FROM 
25a0: 63 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61  clause are conta
25b0: 69 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65  ined in the Sele
25c0: 63 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72  ct.pSrc structur
25d0: 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d  e..** The left m
25e0: 6f 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65  ost table is the
25f0: 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
2600: 53 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68  Select.pSrc.  Th
2610: 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20  e right-most.** 
2620: 74 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73  table is the las
2630: 74 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f  t entry.  The jo
2640: 69 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68  in operator is h
2650: 65 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79  eld in the entry
2660: 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e   to.** the left.
2670: 20 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63    Thus entry 0 c
2680: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e  ontains the join
2690: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68   operator for th
26a0: 65 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a  e join between.*
26b0: 2a 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20  * entries 0 and 
26c0: 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53  1.  Any ON or US
26d0: 49 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f  ING clauses asso
26e0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
26f0: 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f  join are.** also
2700: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
2710: 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a   left entry..**.
2720: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2730: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
2740: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63  er of errors enc
2750: 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61  ountered..*/.sta
2760: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72  tic int sqlitePr
2770: 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20  ocessJoin(Parse 
2780: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
2790: 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  *p){.  SrcList *
27a0: 70 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  pSrc;           
27b0: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61         /* All ta
27c0: 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
27d0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
27e0: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2800: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
2810: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2820: 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20  t_item *pLeft;  
2830: 20 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65     /* Left table
2840: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
2850: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2860: 74 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20  t_item *pRight; 
2870: 20 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c     /* Right tabl
2880: 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a  e being joined *
2890: 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  /..  pSrc = p->p
28a0: 53 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26  Src;.  pLeft = &
28b0: 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52  pSrc->a[0];.  pR
28c0: 69 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d  ight = &pLeft[1]
28d0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
28e0: 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b  Src->nSrc-1; i++
28f0: 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66  , pRight++, pLef
2900: 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  t++){.    Table 
2910: 2a 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66  *pLeftTab = pLef
2920: 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62  t->pTab;.    Tab
2930: 6c 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20  le *pRightTab = 
2940: 70 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20  pRight->pTab;.  
2950: 20 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a    int isOuter;..
2960: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c      if( NEVER(pL
2970: 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69  eftTab==0 || pRi
2980: 67 68 74 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e  ghtTab==0) ) con
2990: 74 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75 74  tinue;.    isOut
29a0: 65 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 6a 6f  er = (pRight->jo
29b0: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
29c0: 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57  R)!=0;..    /* W
29d0: 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20  hen the NATURAL 
29e0: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
29f0: 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c  nt, add WHERE cl
2a00: 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20  ause terms for. 
2a10: 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75     ** every colu
2a20: 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  mn that the two 
2a30: 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63  tables have in c
2a40: 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ommon..    */.  
2a50: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6a 6f    if( pRight->jo
2a60: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
2a70: 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  RAL ){.      if(
2a80: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20   pRight->pOn || 
2a90: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
2aa0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2ab0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2ac0: 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  , "a NATURAL joi
2ad0: 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22  n may not have "
2ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20  .           "an 
2af0: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2b00: 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  se", 0);.       
2b10: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
2b20: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30   }.      for(j=0
2b30: 3b 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43  ; j<pLeftTab->nC
2b40: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
2b50: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
2b60: 70 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a  pLeftTab->aCol[j
2b70: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
2b80: 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   if( columnIndex
2b90: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
2ba0: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
2bb0: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
2bc0: 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 70  pParse, zName, p
2bd0: 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e  LeftTab, pLeft->
2be0: 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20 20  zAlias, .       
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 20 20 20 20 20 20 70 52 69 67 68 74 54 61 62         pRightTab
2c10: 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73  , pRight->zAlias
2c20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c40: 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c  pRight->iCursor,
2c50: 20 26 70 2d 3e 70 57 68 65 72 65 2c 20 69 73 4f   &p->pWhere, isO
2c60: 75 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  uter);.         
2c70: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
2c80: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
2c90: 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20  * Disallow both 
2ca0: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
2cb0: 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65  uses in the same
2cc0: 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20   join.    */.   
2cd0: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e   if( pRight->pOn
2ce0: 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69   && pRight->pUsi
2cf0: 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
2d00: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2d10: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65  se, "cannot have
2d20: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
2d30: 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c  NG ".        "cl
2d40: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
2d50: 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20  e join");.      
2d60: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2d70: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
2d80: 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  ON clause to the
2d90: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
2da0: 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63  E clause, connec
2db0: 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e  ted by.    ** an
2dc0: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
2dd0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
2de0: 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20  ight->pOn ){.   
2df0: 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20 29     if( isOuter )
2e00: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69   setJoinExpr(pRi
2e10: 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74  ght->pOn, pRight
2e20: 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2e30: 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71    p->pWhere = sq
2e40: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
2e50: 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65  rse->db, p->pWhe
2e60: 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29  re, pRight->pOn)
2e70: 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e  ;.      pRight->
2e80: 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  pOn = 0;.    }..
2e90: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78      /* Create ex
2ea0: 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65  tra terms on the
2eb0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f   WHERE clause fo
2ec0: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61  r each column na
2ed0: 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  med.    ** in th
2ee0: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20  e USING clause. 
2ef0: 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65   Example: If the
2f00: 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62   two tables to b
2f10: 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20  e joined are .  
2f20: 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64    ** A and B and
2f30: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
2f40: 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e  e names X, Y, an
2f50: 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68  d Z, then add th
2f60: 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  is.    ** to the
2f70: 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20   WHERE clause:  
2f80: 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e    A.X=B.X AND A.
2f90: 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e  Y=B.Y AND A.Z=B.
2fa0: 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20  Z.    ** Report 
2fb0: 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20  an error if any 
2fc0: 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64  column mentioned
2fd0: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
2fe0: 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e  ause is.    ** n
2ff0: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
3000: 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62  both tables to b
3010: 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f  e joined..    */
3020: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
3030: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
3040: 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d   IdList *pList =
3050: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b   pRight->pUsing;
3060: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3070: 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b  j<pList->nId; j+
3080: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
3090: 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d   *zName = pList-
30a0: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[j].zName;.   
30b0: 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49       if( columnI
30c0: 6e 64 65 78 28 70 4c 65 66 74 54 61 62 2c 20 7a  ndex(pLeftTab, z
30d0: 4e 61 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c 75 6d  Name)<0 || colum
30e0: 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62  nIndex(pRightTab
30f0: 2c 20 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a 20 20  , zName)<0 ){.  
3100: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3110: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3120: 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69  "cannot join usi
3130: 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63  ng column %s - c
3140: 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20  olumn ".        
3150: 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74      "not present
3160: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22   in both tables"
3170: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
3180: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3190: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31a0: 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61  addWhereTerm(pPa
31b0: 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c 65 66  rse, zName, pLef
31c0: 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c  tTab, pLeft->zAl
31d0: 69 61 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ias, .          
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f0: 20 20 70 52 69 67 68 74 54 61 62 2c 20 70 52 69    pRightTab, pRi
3200: 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20  ght->zAlias,.   
3210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3220: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d           pRight-
3230: 3e 69 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57  >iCursor, &p->pW
3240: 68 65 72 65 2c 20 69 73 4f 75 74 65 72 29 3b 0a  here, isOuter);.
3250: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3260: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
3270: 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f  ./*.** Insert co
3280: 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61 74  de into "v" that
3290: 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72   will push the r
32a0: 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f 70  ecord on the top
32b0: 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b   of the.** stack
32c0: 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   into the sorter
32d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
32e0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
32f0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3300: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ,         /* Par
3310: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
3320: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
3330: 72 42 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 4f  rBy,    /* The O
3340: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
3350: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
3360: 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ect,       /* Th
3370: 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73  e whole SELECT s
3380: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
3390: 74 20 72 65 67 44 61 74 61 20 20 20 20 20 20 20  t regData       
33a0: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
33b0: 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f   holding data to
33c0: 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 29 7b   be sorted */.){
33d0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
33e0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
33f0: 74 20 6e 45 78 70 72 20 3d 20 70 4f 72 64 65 72  t nExpr = pOrder
3400: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e 74  By->nExpr;.  int
3410: 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74   regBase = sqlit
3420: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
3430: 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b  Parse, nExpr+2);
3440: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
3450: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
3460: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
3470: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
3480: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
3490: 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61 73  pOrderBy, regBas
34a0: 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  e, 0);.  sqlite3
34b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
34c0: 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64 65  _Sequence, pOrde
34d0: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  rBy->iECursor, r
34e0: 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20  egBase+nExpr);. 
34f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
3500: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
3510: 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45  Data, regBase+nE
3520: 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71 6c  xpr+1, 1);.  sql
3530: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
3540: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
3550: 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72 20   regBase, nExpr 
3560: 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  + 2, regRecord);
3570: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3580: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
3590: 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e  sert, pOrderBy->
35a0: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63  iECursor, regRec
35b0: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ord);.  sqlite3R
35c0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
35d0: 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
35e0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
35f0: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
3600: 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78  se, regBase, nEx
3610: 70 72 2b 32 29 3b 0a 20 20 69 66 28 20 70 53 65  pr+2);.  if( pSe
3620: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  lect->iLimit ){.
3630: 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61      int addr1, a
3640: 64 64 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c  ddr2;.    int iL
3650: 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53  imit;.    if( pS
3660: 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29  elect->iOffset )
3670: 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d  {.      iLimit =
3680: 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65   pSelect->iOffse
3690: 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  t+1;.    }else{.
36a0: 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70        iLimit = p
36b0: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a  Select->iLimit;.
36c0: 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 31 20      }.    addr1 
36d0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
36e0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op1(v, OP_IfZero
36f0: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73  , iLimit);.    s
3700: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3710: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69  (v, OP_AddImm, i
3720: 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20  Limit, -1);.    
3730: 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
3740: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
3750: 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74  Goto);.    sqlit
3760: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
3770: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71  , addr1);.    sq
3780: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
3790: 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64  v, OP_Last, pOrd
37a0: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b  erBy->iECursor);
37b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
37c0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
37d0: 65 74 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  ete, pOrderBy->i
37e0: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71  ECursor);.    sq
37f0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
3800: 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20  e(v, addr2);.   
3810: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
3820: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
3830: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
3840: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
3850: 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  SET.*/.static vo
3860: 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20  id codeOffset(. 
3870: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
3880: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
3890: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
38a0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
38b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
38c0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
38d0: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
38e0: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20   int iContinue  
38f0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
3900: 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72  to skip the curr
3910: 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b  ent record */.){
3920: 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65  .  if( p->iOffse
3930: 74 20 26 26 20 69 43 6f 6e 74 69 6e 75 65 21 3d  t && iContinue!=
3940: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  0 ){.    int add
3950: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  r;.    sqlite3Vd
3960: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
3970: 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66 73 65  ddImm, p->iOffse
3980: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  t, -1);.    addr
3990: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
39a0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 65 67  dOp1(v, OP_IfNeg
39b0: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20  , p->iOffset);. 
39c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
39d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
39e0: 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   0, iContinue);.
39f0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
3a00: 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45 54  (v, "skip OFFSET
3a10: 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 20   records"));.   
3a20: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
3a30: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
3a40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
3a50: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
3a60: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
3a70: 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72  e the N register
3a80: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d  s starting at iM
3a90: 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73  em.** form a dis
3aa0: 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54  tinct entry.  iT
3ab0: 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20  ab is a sorting 
3ac0: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
3ad0: 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73   previously.** s
3ae0: 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  een combinations
3af0: 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73   of the N values
3b00: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
3b10: 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a  s made in iTab.*
3b20: 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  * if the current
3b30: 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65   N values are ne
3b40: 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  w..**.** A jump 
3b50: 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73  to addrRepeat is
3b60: 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b   made and the N+
3b70: 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70  1 values are pop
3b80: 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ped from the.** 
3b90: 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70  stack if the top
3ba0: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20   N elements are 
3bb0: 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f  not distinct..*/
3bc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
3bd0: 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72  eDistinct(.  Par
3be0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
3bf0: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
3c00: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
3c10: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
3c20: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
3c30: 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  * A sorting inde
3c40: 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66  x used to test f
3c50: 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20  or distinctness 
3c60: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70  */.  int addrRep
3c70: 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eat,    /* Jump 
3c80: 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64  to here if not d
3c90: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
3ca0: 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
3cb0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
3cc0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
3cd0: 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem           /*
3ce0: 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a   First element *
3cf0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  /.){.  Vdbe *v;.
3d00: 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d    int r1;..  v =
3d10: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
3d20: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
3d30: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
3d40: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3d50: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
3d60: 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c  Record, iMem, N,
3d70: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   r1);.  sqlite3V
3d80: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
3d90: 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64  Found, iTab, add
3da0: 72 52 65 70 65 61 74 2c 20 72 31 29 3b 0a 20 20  rRepeat, r1);.  
3db0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3dc0: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
3dd0: 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20  t, iTab, r1);.  
3de0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
3df0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
3e00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
3e10: 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rate an error me
3e20: 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c  ssage when a SEL
3e30: 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74 68  ECT is used with
3e40: 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73 69  in a subexpressi
3e50: 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20  on.** (example: 
3e60: 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a   "a IN (SELECT *
3e70: 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62   FROM table)") b
3e80: 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74  ut it has more t
3e90: 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20  han 1 result.** 
3ea0: 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74  column.  We do t
3eb0: 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74  his in a subrout
3ec0: 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65 20  ine because the 
3ed0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
3ee0: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 70 6c 61 63  multiple.** plac
3ef0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
3f00: 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  t checkForMultiC
3f10: 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
3f20: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3f30: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
3f40: 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20  e context. */.  
3f50: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
3f60: 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74  t,   /* Destinat
3f70: 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65  ion of SELECT re
3f80: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  sults */.  int n
3f90: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
3fa0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
3fb0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75  ult columns retu
3fc0: 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a  rned by SELECT *
3fd0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74  /.){.  int eDest
3fe0: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
3ff0: 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26  .  if( nExpr>1 &
4000: 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  & (eDest==SRT_Me
4010: 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  m || eDest==SRT_
4020: 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Set) ){.    sqli
4030: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4040: 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67  se, "only a sing
4050: 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65  le result allowe
4060: 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22  d for ".       "
4070: 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73  a SELECT that is
4080: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
4090: 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65  ession");.    re
40a0: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
40b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
40c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
40d0: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
40e0: 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
40f0: 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68  the inside of th
4100: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
4110: 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  of a SELECT..**.
4120: 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e 64  ** If srcTab and
4130: 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74   nColumn are bot
4140: 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  h zero, then the
4150: 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69   pEList expressi
4160: 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75  ons.** are evalu
4170: 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
4180: 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f   get the data fo
4190: 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20  r this row.  If 
41a0: 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65  nColumn>0.** the
41b0: 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64  n data is pulled
41c0: 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64   from srcTab and
41d0: 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20   pEList is used 
41e0: 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a  only to get the.
41f0: 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f 72  ** datatypes for
4200: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
4210: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
4220: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
4230: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4240: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
4250: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
4260: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
4270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
4280: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
4290: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
42a0: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70  g coded */.  Exp
42b0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
42c0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
42d0: 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74  values being ext
42e0: 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racted */.  int 
42f0: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
4300: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
4310: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
4320: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
4330: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n,            /*
4340: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
4350: 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65  ns in the source
4360: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
4370: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
4380: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
4390: 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73  LL, sort results
43a0: 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20   using this key 
43b0: 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63  */.  int distinc
43c0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
43d0: 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72  If >=0, make sur
43e0: 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
43f0: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 53 65 6c 65  stinct */.  Sele
4400: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
4410: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
4420: 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
4430: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ults */.  int iC
4440: 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20  ontinue,        
4450: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
4460: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
4470: 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  next row */.  in
4480: 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
4490: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
44a0: 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
44b0: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
44c0: 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  p */.){.  Vdbe *
44d0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
44e0: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
44f0: 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20  t hasDistinct;  
4500: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
4510: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
4520: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
4530: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73   */.  int regRes
4540: 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ult;            
4550: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65    /* Start of me
4560: 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73  mory holding res
4570: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  ult set */.  int
4580: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
4590: 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20  eDest;   /* How 
45a0: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65  to dispose of re
45b0: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
45c0: 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 50  Parm = pDest->iP
45d0: 61 72 6d 3b 20 20 20 2f 2a 20 46 69 72 73 74 20  arm;   /* First 
45e0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70  argument to disp
45f0: 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
4600: 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b   int nResultCol;
4610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4620: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
4630: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61   columns */..  a
4640: 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 69 66  ssert( v );.  if
4650: 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
4660: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
4670: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
4680: 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 64   hasDistinct = d
4690: 69 73 74 69 6e 63 74 3e 3d 30 3b 0a 20 20 69 66  istinct>=0;.  if
46a0: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ( pOrderBy==0 &&
46b0: 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b   !hasDistinct ){
46c0: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
46d0: 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29  v, p, iContinue)
46e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c  ;.  }..  /* Pull
46f0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
4700: 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  olumns..  */.  i
4710: 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a  f( nColumn>0 ){.
4720: 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d      nResultCol =
4730: 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73   nColumn;.  }els
4740: 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f  e{.    nResultCo
4750: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
4760: 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65  r;.  }.  if( pDe
4770: 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20  st->iMem==0 ){. 
4780: 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d     pDest->iMem =
4790: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
47a0: 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  .    pDest->nMem
47b0: 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20   = nResultCol;. 
47c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
47d0: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20  += nResultCol;. 
47e0: 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61 73 73   }else{ .    ass
47f0: 65 72 74 28 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  ert( pDest->nMem
4800: 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a  ==nResultCol );.
4810: 20 20 7d 0a 20 20 72 65 67 52 65 73 75 6c 74 20    }.  regResult 
4820: 3d 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3b 0a 20  = pDest->iMem;. 
4830: 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29   if( nColumn>0 )
4840: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
4850: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
4860: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4870: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
4880: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c  lumn, srcTab, i,
4890: 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20   regResult+i);. 
48a0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
48b0: 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73   eDest!=SRT_Exis
48c0: 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ts ){.    /* If 
48d0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
48e0: 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e  is an EXISTS(...
48f0: 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  ) expression, th
4900: 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20  e actual.    ** 
4910: 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20  values returned 
4920: 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72  by the SELECT ar
4930: 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  e not required..
4940: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
4950: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
4960: 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  st(pParse, pELis
4970: 74 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 65 44  t, regResult, eD
4980: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 29  est==SRT_Output)
4990: 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20  ;.  }.  nColumn 
49a0: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20  = nResultCol;.. 
49b0: 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54 49   /* If the DISTI
49c0: 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20  NCT keyword was 
49d0: 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53  present on the S
49e0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
49f0: 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f    ** and this ro
4a00: 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20  w has been seen 
4a10: 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20  before, then do 
4a20: 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f  not make this ro
4a30: 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74  w.  ** part of t
4a40: 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a  he result..  */.
4a50: 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e 63    if( hasDistinc
4a60: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
4a70: 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
4a80: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
4a90: 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75 6d 6e  ->nExpr==nColumn
4aa0: 20 29 3b 0a 20 20 20 20 63 6f 64 65 44 69 73 74   );.    codeDist
4ab0: 69 6e 63 74 28 70 50 61 72 73 65 2c 20 64 69 73  inct(pParse, dis
4ac0: 74 69 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65  tinct, iContinue
4ad0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 65  , nColumn, regRe
4ae0: 73 75 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 70  sult);.    if( p
4af0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
4b00: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
4b10: 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , p, iContinue);
4b20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
4b30: 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  ( checkForMultiC
4b40: 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
4b50: 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20  (pParse, pDest, 
4b60: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
4b70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
4b80: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
4b90: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
4ba0: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
4bb0: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
4bc0: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
4bd0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
4be0: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
4bf0: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
4c00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
4c10: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
4c20: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
4c30: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
4c40: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
4c50: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
4c60: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
4c70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4c80: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
4c90: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
4ca0: 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20  lumn, r1);.     
4cb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4cc0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
4cd0: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a  rt, iParm, r1);.
4ce0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
4cf0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
4d00: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
4d10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
4d20: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
4d30: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
4d40: 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75  query result, bu
4d50: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  t instead of.   
4d60: 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20   ** saving that 
4d70: 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61  record, use it a
4d80: 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74  s a key to delet
4d90: 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a  e elements from.
4da0: 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f      ** the tempo
4db0: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
4dc0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
4dd0: 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a  e SRT_Except: {.
4de0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4df0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64  eAddOp3(v, OP_Id
4e00: 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20  xDelete, iParm, 
4e10: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
4e20: 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
4e30: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
4e40: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
4e50: 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
4e60: 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
4e70: 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
4e80: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
4e90: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
4ea0: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
4eb0: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
4ec0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
4ed0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4ee0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4ef0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
4f00: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  esult, nColumn, 
4f10: 72 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  r1);.      if( p
4f20: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
4f30: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
4f40: 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  r(pParse, pOrder
4f50: 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20  By, p, r1);.    
4f60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4f70: 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
4f80: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
4f90: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
4fa0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4fb0: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
4fc0: 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20  Parm, r2);.     
4fd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4fe0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
4ff0: 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32  t, iParm, r1, r2
5000: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5010: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
5020: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
5030: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5040: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
5050: 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
5060: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
5070: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
5080: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
5090: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
50a0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
50b0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
50c0: 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
50d0: 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66  creating a set f
50e0: 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28  or an "expr IN (
50f0: 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e  SELECT ...)" con
5100: 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74  struct,.    ** t
5110: 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64  hen there should
5120: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65   be a single ite
5130: 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
5140: 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20   Write this.    
5150: 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65  ** item into the
5160: 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20   set table with 
5170: 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20  bogus data..    
5180: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
5190: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
51a0: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
51b0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69  );.      p->affi
51c0: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 43 6f  nity = sqlite3Co
51d0: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
51e0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
51f0: 2c 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74  , pDest->affinit
5200: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  y);.      if( pO
5210: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
5220: 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c    /* At first gl
5230: 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74  ance you would t
5240: 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70  hink we could op
5250: 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20  timize out the. 
5260: 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20         ** ORDER 
5270: 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  BY in this case 
5280: 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20  since the order 
5290: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
52a0: 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a  e set.        **
52b0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
52c0: 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67  .  But there mig
52d0: 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c  ht be a LIMIT cl
52e0: 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20  ause, in which. 
52f0: 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
5300: 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61  he order does ma
5310: 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  tter */.        
5320: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
5330: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
5340: 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a   p, regResult);.
5350: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5360: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
5370: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
5380: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
5390: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
53a0: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
53b0: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
53c0: 31 2c 20 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e  1, r1, &p->affin
53d0: 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ity, 1);.       
53e0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
53f0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
5400: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
5410: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  t, 1);.        s
5420: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5430: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
5440: 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20  , iParm, r1);.  
5450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
5460: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
5470: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d  se, r1);.      }
5480: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5490: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
54a0: 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20  ny row exist in 
54b0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
54c0: 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74  record that fact
54d0: 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20   and abort..    
54e0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
54f0: 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20  Exists: {.      
5500: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5510: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
5520: 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20   1, iParm);.    
5530: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
5540: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
5550: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
5560: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
5570: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
5580: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
5590: 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
55a0: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
55b0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
55c0: 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
55d0: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
55e0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
55f0: 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
5600: 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
5610: 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
5620: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5630: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
5640: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
5650: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  n==1 );.      if
5660: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
5670: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
5680: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
5690: 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73  derBy, p, regRes
56a0: 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ult);.      }els
56b0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
56c0: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
56d0: 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74  Parse, regResult
56e0: 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  , iParm, 1);.   
56f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
5700: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75  T clause will ju
5710: 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  mp out of the lo
5720: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
5730: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
5740: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
5750: 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
5760: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
5770: 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74  /..    /* Send t
5780: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63  he data to the c
5790: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
57a0: 20 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75 74   or to a subrout
57b0: 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20 20  ine.  In the.   
57c0: 20 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73 75   ** case of a su
57d0: 62 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73 75  broutine, the su
57e0: 62 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 20  broutine itself 
57f0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
5800: 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e  or.    ** poppin
5810: 67 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20  g the data from 
5820: 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a  the stack..    *
5830: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  /.    case SRT_C
5840: 6f 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63 61  oroutine:.    ca
5850: 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b  se SRT_Output: {
5860: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
5870: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rBy ){.        i
5880: 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
5890: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
58a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
58b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
58c0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
58d0: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
58e0: 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  n, r1);.        
58f0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
5900: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
5910: 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20   p, r1);.       
5920: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5930: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5940: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  1);.      }else 
5950: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
5960: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
5970: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5980: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
5990: 64 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29  d, pDest->iParm)
59a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
59b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
59c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
59d0: 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73  esultRow, regRes
59e0: 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  ult, nColumn);. 
59f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
5a00: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
5a10: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
5a20: 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e  gResult, nColumn
5a30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5a40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
5a50: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
5a60: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
5a70: 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20  .    /* Discard 
5a80: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
5a90: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53  is is used for S
5aa0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
5ab0: 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74   inside.    ** t
5ac0: 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49  he body of a TRI
5ad0: 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f  GGER.  The purpo
5ae0: 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63  se of such selec
5af0: 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20  ts is to call.  
5b00: 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65    ** user-define
5b10: 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  d functions that
5b20: 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63   have side effec
5b30: 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63  ts.  We do not c
5b40: 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74  are.    ** about
5b50: 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75   the actual resu
5b60: 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
5b70: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
5b80: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
5b90: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
5ba0: 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20  T_Discard );.   
5bb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5bc0: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
5bd0: 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   Jump to the end
5be0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20   of the loop if 
5bf0: 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61  the LIMIT is rea
5c00: 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ched..  */.  if(
5c10: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
5c20: 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
5c30: 42 79 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 66 20  By==0 );  /* If 
5c40: 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
5c50: 52 20 42 59 2c 20 74 68 65 20 63 61 6c 6c 20 74  R BY, the call t
5c60: 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o.              
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
5c80: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
5c90: 29 20 77 6f 75 6c 64 20 68 61 76 65 20 63 6c 65  ) would have cle
5ca0: 61 72 65 64 20 70 2d 3e 69 4c 69 6d 69 74 20 2a  ared p->iLimit *
5cb0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
5cc0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
5cd0: 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  dImm, p->iLimit,
5ce0: 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   -1);.    sqlite
5cf0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5d00: 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  P_IfZero, p->iLi
5d10: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  mit, iBreak);.  
5d20: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
5d30: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
5d40: 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ist, generate a 
5d50: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
5d60: 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a  e that records.*
5d70: 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * the collating 
5d80: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63  sequence for eac
5d90: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
5da0: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20  that expression 
5db0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  list..**.** If t
5dc0: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61  he ExprList is a
5dd0: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
5de0: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68  OUP BY clause th
5df0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  en the resulting
5e00: 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  .** KeyInfo stru
5e10: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
5e20: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
5e30: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20  izing a virtual 
5e40: 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c  index to.** impl
5e50: 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73  ement that claus
5e60: 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c  e.  If the ExprL
5e70: 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  ist is the resul
5e80: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
5e90: 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65  T.** then the Ke
5ea0: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
5eb0: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
5ec0: 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  or initializing 
5ed0: 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64  a virtual.** ind
5ee0: 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ex to implement 
5ef0: 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e  a DISTINCT test.
5f00: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
5f10: 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f  hold the KeyInfo
5f20: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62   structure is ob
5f30: 74 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  tain from malloc
5f40: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  .  The calling.*
5f50: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  * function is re
5f60: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65  sponsible for se
5f70: 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73  eing that this s
5f80: 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e  tructure is even
5f90: 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e  tually.** freed.
5fa0: 20 20 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66    Add the KeyInf
5fb0: 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  o structure to t
5fc0: 68 65 20 50 34 20 66 69 65 6c 64 20 6f 66 20 61  he P4 field of a
5fd0: 6e 20 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a  n opcode using.*
5fe0: 2a 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  * P4_KEYINFO_HAN
5ff0: 44 4f 46 46 20 69 73 20 74 68 65 20 75 73 75 61  DOFF is the usua
6000: 6c 20 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67  l way of dealing
6010: 20 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73   with this..*/.s
6020: 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b  tatic KeyInfo *k
6030: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
6040: 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  st(Parse *pParse
6050: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
6060: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  t){.  sqlite3 *d
6070: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
6080: 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b    int nExpr;.  K
6090: 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20  eyInfo *pInfo;. 
60a0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
60b0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
60c0: 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20  int i;..  nExpr 
60d0: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
60e0: 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65    pInfo = sqlite
60f0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
6100: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29  , sizeof(*pInfo)
6110: 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66   + nExpr*(sizeof
6120: 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b  (CollSeq*)+1) );
6130: 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a  .  if( pInfo ){.
6140: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74      pInfo->aSort
6150: 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49  Order = (u8*)&pI
6160: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72  nfo->aColl[nExpr
6170: 5d 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46  ];.    pInfo->nF
6180: 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 45 78 70  ield = (u16)nExp
6190: 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65 6e  r;.    pInfo->en
61a0: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
61b0: 20 70 49 6e 66 6f 2d 3e 64 62 20 3d 20 64 62 3b   pInfo->db = db;
61c0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
61d0: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
61e0: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
61f0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  m++){.      Coll
6200: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
6210: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
6220: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
6230: 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
6240: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  r);.      if( !p
6250: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
6260: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
6270: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
6280: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
6290: 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  l[i] = pColl;.  
62a0: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74      pInfo->aSort
62b0: 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d  Order[i] = pItem
62c0: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
62d0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
62e0: 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pInfo;.}.../*.**
62f0: 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   If the inner lo
6300: 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  op was generated
6310: 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c   using a non-nul
6320: 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d  l pOrderBy argum
6330: 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ent,.** then the
6340: 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c   results were pl
6350: 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72  aced in a sorter
6360: 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f  .  After the loo
6370: 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a  p is terminated.
6380: 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75  ** we need to ru
6390: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64  n the sorter and
63a0: 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75   output the resu
63b0: 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  lts.  The follow
63c0: 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  ing.** routine g
63d0: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
63e0: 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74  e needed to do t
63f0: 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  hat..*/.static v
6400: 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74  oid generateSort
6410: 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70  Tail(.  Parse *p
6420: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
6430: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
6440: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
6450: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
6460: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
6470: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
6480: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
6490: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44  ode into this VD
64a0: 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  BE */.  int nCol
64b0: 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d  umn,      /* Num
64c0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f  ber of columns o
64d0: 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  f data */.  Sele
64e0: 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a  ctDest *pDest /*
64f0: 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65   Write the sorte
6500: 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  d results here *
6510: 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 42  /.){.  int addrB
6520: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
6530: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
6540: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
6550: 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f   to exit loop */
6560: 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69  .  int addrConti
6570: 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
6580: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
6590: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72  /* Jump here for
65a0: 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20   next cycle */. 
65b0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74   int addr;.  int
65c0: 20 69 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65   iTab;.  int pse
65d0: 75 64 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45 78  udoTab = 0;.  Ex
65e0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
65f0: 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
6600: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
6610: 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69  Dest->eDest;.  i
6620: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
6630: 2d 3e 69 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20  ->iParm;..  int 
6640: 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65  regRow;.  int re
6650: 67 52 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62 20  gRowid;..  iTab 
6660: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  = pOrderBy->iECu
6670: 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73  rsor;.  if( eDes
6680: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
6690: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
66a0: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73 65  utine ){.    pse
66b0: 75 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65 2d  udoTab = pParse-
66c0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nTab++;.    sql
66d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
66e0: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
66f0: 20 70 73 65 75 64 6f 54 61 62 2c 20 65 44 65 73   pseudoTab, eDes
6700: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 2c 20 6e  t==SRT_Output, n
6710: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20 61  Column);.  }.  a
6720: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
6730: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6740: 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64  P_Sort, iTab, ad
6750: 64 72 42 72 65 61 6b 29 3b 0a 20 20 63 6f 64 65  drBreak);.  code
6760: 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 61 64 64  Offset(v, p, add
6770: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 72 65  rContinue);.  re
6780: 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65  gRow = sqlite3Ge
6790: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
67a0: 3b 0a 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73  ;.  regRowid = s
67b0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
67c0: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
67d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
67e0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
67f0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
6800: 72 20 2b 20 31 2c 20 72 65 67 52 6f 77 29 3b 0a  r + 1, regRow);.
6810: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
6820: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
6830: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
6840: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
6850: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6860: 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
6870: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
6880: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  se( eDest==SRT_E
6890: 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
68a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
68b0: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
68c0: 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  d, iParm, regRow
68d0: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
68e0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
68f0: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
6900: 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77  , regRow, regRow
6910: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
6920: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
6930: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
6940: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6950: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
6960: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
6970: 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  Y.    case SRT_S
6980: 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  et: {.      asse
6990: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
69a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
69b0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
69c0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
69d0: 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c  ow, 1, regRowid,
69e0: 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31   &p->affinity, 1
69f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6a00: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
6a10: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
6a20: 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20  regRow, 1);.    
6a30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6a40: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
6a50: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
6a60: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65  owid);.      bre
6a70: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6a80: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
6a90: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
6aa0: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
6ab0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
6ac0: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  ove(pParse, regR
6ad0: 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  ow, iParm, 1);. 
6ae0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
6af0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
6b00: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
6b10: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
6b20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
6b30: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 53 52  ndif.    case SR
6b40: 54 5f 4f 75 74 70 75 74 3a 0a 20 20 20 20 63 61  T_Output:.    ca
6b50: 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
6b60: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  : {.      int i;
6b70: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
6b80: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
6b90: 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ut );.      test
6ba0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
6bb0: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20  _Coroutine );.  
6bc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6bd0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
6be0: 67 65 72 2c 20 31 2c 20 72 65 67 52 6f 77 69 64  ger, 1, regRowid
6bf0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6c00: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6c10: 5f 49 6e 73 65 72 74 2c 20 70 73 65 75 64 6f 54  _Insert, pseudoT
6c20: 61 62 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52  ab, regRow, regR
6c30: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 66 6f 72  owid);.      for
6c40: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
6c50: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   i++){.        a
6c60: 73 73 65 72 74 28 20 72 65 67 52 6f 77 21 3d 70  ssert( regRow!=p
6c70: 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 20 29 3b 0a  Dest->iMem+i );.
6c80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6c90: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6ca0: 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64 6f 54 61  Column, pseudoTa
6cb0: 62 2c 20 69 2c 20 70 44 65 73 74 2d 3e 69 4d 65  b, i, pDest->iMe
6cc0: 6d 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  m+i);.      }.  
6cd0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
6ce0: 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
6cf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6d00: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
6d10: 75 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69  ultRow, pDest->i
6d20: 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Mem, nColumn);. 
6d30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
6d40: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
6d50: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44  hange(pParse, pD
6d60: 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75  est->iMem, nColu
6d70: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mn);.      }else
6d80: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6d90: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
6da0: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
6db0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  iParm);.      }.
6dc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6dd0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
6de0: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
6df0: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62  thing */.      b
6e00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
6e10: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
6e20: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
6e30: 72 65 67 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74  regRow);.  sqlit
6e40: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
6e50: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69  (pParse, regRowi
6e60: 64 29 3b 0a 0a 20 20 2f 2a 20 4c 49 4d 49 54 20  d);..  /* LIMIT 
6e70: 68 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65  has been impleme
6e80: 6e 74 65 64 20 62 79 20 74 68 65 20 70 75 73 68  nted by the push
6e90: 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20 72 6f 75  OntoSorter() rou
6ea0: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tine..  */.  ass
6eb0: 65 72 74 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d  ert( p->iLimit==
6ec0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 62  0 );..  /* The b
6ed0: 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
6ee0: 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
6ef0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
6f00: 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  (v, addrContinue
6f10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6f20: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
6f30: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a  t, iTab, addr);.
6f40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
6f50: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
6f60: 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 65  rBreak);.  if( e
6f70: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
6f80: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
6f90: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
6fa0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6fb0: 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  2(v, OP_Close, p
6fc0: 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20  seudoTab, 0);.  
6fd0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
6fe0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
6ff0: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
7000: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
7010: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
7020: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
7030: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
7040: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
7050: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
7060: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   caller..**.** T
7070: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
7080: 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74  ype is the exact
7090: 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69   datatype defini
70a0: 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66  tion extracted f
70b0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69  rom the.** origi
70c0: 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45  nal CREATE TABLE
70d0: 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68   statement if th
70e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
70f0: 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a  a column. The.**
7100: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
7110: 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69  e for a ROWID fi
7120: 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20  eld is INTEGER. 
7130: 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20  Exactly when an 
7140: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
7150: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f   considered a co
7160: 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70  lumn can be comp
7170: 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65  lex in the prese
7180: 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65  nce of subquerie
7190: 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74  s. The.** result
71a0: 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20  -set expression 
71b0: 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  in all of the fo
71c0: 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73  llowing SELECT s
71d0: 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a  tatements is .**
71e0: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f   considered a co
71f0: 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e  lumn by this fun
7200: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  ction..**.**   S
7210: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
7220: 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  bl;.**   SELECT 
7230: 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d  (SELECT col FROM
7240: 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43   tbl;.**   SELEC
7250: 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52  T (SELECT col FR
7260: 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45  OM tbl);.**   SE
7270: 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53  LECT abc FROM (S
7280: 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63  ELECT col AS abc
7290: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a   FROM tbl);.** .
72a0: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
72b0: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20  on type for any 
72c0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72  expression other
72d0: 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69   than a column i
72e0: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  s NULL..*/.stati
72f0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
7300: 6c 75 6d 6e 54 79 70 65 28 0a 20 20 4e 61 6d 65  lumnType(.  Name
7310: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20  Context *pNC, . 
7320: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20   Expr *pExpr,.  
7330: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
7340: 72 69 67 69 6e 44 62 2c 0a 20 20 63 6f 6e 73 74  riginDb,.  const
7350: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
7360: 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Tab,.  const cha
7370: 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 0a  r **pzOriginCol.
7380: 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ){.  char const 
7390: 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68  *zType = 0;.  ch
73a0: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69  ar const *zOrigi
73b0: 6e 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  nDb = 0;.  char 
73c0: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 54 61  const *zOriginTa
73d0: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
73e0: 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 43 6f 6c 20  nst *zOriginCol 
73f0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
7400: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20  if( pExpr==0 || 
7410: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30  pNC->pSrcList==0
7420: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
7430: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
7440: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
7450: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
7460: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
7470: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
7480: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
7490: 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74  column. Locate t
74a0: 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c  he table the col
74b0: 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20  umn is being.   
74c0: 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20     ** extracted 
74d0: 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74  from in NameCont
74e0: 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68  ext.pSrcList. Th
74f0: 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20  is table may be 
7500: 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61  real.      ** da
7510: 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20  tabase table or 
7520: 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  a subquery..    
7530: 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
7540: 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
7550: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
7560: 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e  structure column
7570: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
7580: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  om */.      Sele
7590: 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20  ct *pS = 0;     
75a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
75b0: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  t the column is 
75c0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
75d0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  /.      int iCol
75e0: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
75f0: 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20  n;  /* Index of 
7600: 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a  column in pTab *
7610: 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  /.      while( p
7620: 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  NC && !pTab ){. 
7630: 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a         SrcList *
7640: 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pTabList = pNC->
7650: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20  pSrcList;.      
7660: 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62    for(j=0;j<pTab
7670: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
7680: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
7690: 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61  rsor!=pExpr->iTa
76a0: 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20  ble;j++);.      
76b0: 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74    if( j<pTabList
76c0: 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ->nSrc ){.      
76d0: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
76e0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
76f0: 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70            pS = p
7700: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53  TabList->a[j].pS
7710: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d  elect;.        }
7720: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7730: 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74  pNC = pNC->pNext
7740: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7750: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
7760: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
7770: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 0a 20 20 20    /* FIX ME:.   
7780: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 6e       ** This can
7790: 20 6f 63 63 75 72 73 20 69 66 20 79 6f 75 20 68   occurs if you h
77a0: 61 76 65 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69  ave something li
77b0: 6b 65 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78  ke "SELECT new.x
77c0: 3b 22 20 69 6e 73 69 64 65 0a 20 20 20 20 20 20  ;" inside.      
77d0: 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2e 20    ** a trigger. 
77e0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
77f0: 20 69 66 20 79 6f 75 20 72 65 66 65 72 65 6e 63   if you referenc
7800: 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 22 6e  e the special "n
7810: 65 77 22 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ew".        ** t
7820: 61 62 6c 65 20 69 6e 20 74 68 65 20 72 65 73 75  able in the resu
7830: 6c 74 20 73 65 74 20 6f 66 20 61 20 73 65 6c 65  lt set of a sele
7840: 63 74 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 68  ct.  We do not h
7850: 61 76 65 20 61 20 67 6f 6f 64 20 77 61 79 0a 20  ave a good way. 
7860: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e         ** to fin
7870: 64 20 74 68 65 20 61 63 74 75 61 6c 20 74 61 62  d the actual tab
7880: 6c 65 20 74 79 70 65 2c 20 73 6f 20 63 61 6c 6c  le type, so call
7890: 20 69 74 20 22 54 45 58 54 22 2e 20 20 54 68 69   it "TEXT".  Thi
78a0: 73 20 69 73 20 72 65 61 6c 6c 79 0a 20 20 20 20  s is really.    
78b0: 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67      ** something
78c0: 20 6f 66 20 61 20 62 75 67 2c 20 62 75 74 20 49   of a bug, but I
78d0: 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77   do not know how
78e0: 20 74 6f 20 66 69 78 20 69 74 2e 0a 20 20 20 20   to fix it..    
78f0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
7900: 2a 20 54 68 69 73 20 63 6f 64 65 20 64 6f 65 73  * This code does
7910: 20 6e 6f 74 20 70 72 6f 64 75 63 65 20 74 68 65   not produce the
7920: 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
7930: 2d 20 69 74 20 6a 75 73 74 20 70 72 65 76 65 6e  - it just preven
7940: 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ts.        ** a 
7950: 73 65 67 66 61 75 6c 74 2e 20 20 53 65 65 20 74  segfault.  See t
7960: 69 63 6b 65 74 20 23 31 32 32 39 2e 0a 20 20 20  icket #1229..   
7970: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
7980: 7a 54 79 70 65 20 3d 20 22 54 45 58 54 22 3b 0a  zType = "TEXT";.
7990: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
79a0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
79b0: 73 65 72 74 28 20 70 54 61 62 20 29 3b 0a 20 20  sert( pTab );.  
79c0: 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20      if( pS ){.  
79d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61        /* The "ta
79e0: 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79  ble" is actually
79f0: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72   a sub-select or
7a00: 20 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46   a view in the F
7a10: 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20  ROM clause.     
7a20: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c     ** of the SEL
7a30: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52  ECT statement. R
7a40: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
7a50: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f  ation type and o
7a60: 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  rigin.        **
7a70: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65   data for the re
7a80: 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20  sult-set column 
7a90: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
7aa0: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
7ab0: 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
7ac0: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
7ad0: 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <pS->pEList->nEx
7ae0: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
7af0: 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c   /* If iCol is l
7b00: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
7b10: 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
7b20: 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a  on requests the.
7b30: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77            ** row
7b40: 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  id of the sub-se
7b50: 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68  lect or view. Th
7b60: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
7b70: 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20   legal (see .   
7b80: 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63         ** test c
7b90: 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d  ase misc2.2.2) -
7ba0: 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75   it always evalu
7bb0: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20  ates to NULL..  
7bc0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
7bd0: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
7be0: 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   sNC;.          
7bf0: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
7c00: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
7c10: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  xpr;.          s
7c20: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
7c30: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20  ->pSrc;.        
7c40: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b    sNC.pNext = 0;
7c50: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
7c60: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
7c70: 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  rse;.          z
7c80: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
7c90: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
7ca0: 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54  ginDb, &zOriginT
7cb0: 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29  ab, &zOriginCol)
7cc0: 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
7cd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57     }else if( ALW
7ce0: 41 59 53 28 70 54 61 62 2d 3e 70 53 63 68 65 6d  AYS(pTab->pSchem
7cf0: 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  a) ){.        /*
7d00: 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f   A real table */
7d10: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7d20: 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20   !pS );.        
7d30: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
7d40: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
7d50: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7d60: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
7d70: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
7d80: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
7d90: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
7da0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
7db0: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
7dc0: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
7dd0: 6e 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  nCol = "rowid";.
7de0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7df0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
7e00: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
7e10: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].zType;.       
7e20: 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20     zOriginCol = 
7e30: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
7e40: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
7e50: 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69  }.        zOrigi
7e60: 6e 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  nTab = pTab->zNa
7e70: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
7e80: 70 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20  pNC->pParse ){. 
7e90: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
7ea0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
7eb0: 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61  ToIndex(pNC->pPa
7ec0: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
7ed0: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
7ee0: 20 20 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70     zOriginDb = p
7ef0: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  NC->pParse->db->
7f00: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
7f10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7f20: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
7f30: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
7f40: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
7f50: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
7f60: 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LECT: {.      /*
7f70: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
7f80: 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e  is a sub-select.
7f90: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
7fa0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
7fb0: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  .      ** origin
7fc0: 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69   info for the si
7fd0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ngle column in t
7fe0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
7ff0: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
8000: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a    ** statement..
8010: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e        */.      N
8020: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
8030: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
8040: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
8050: 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ect;.      Expr 
8060: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
8070: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
8080: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
8090: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
80a0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
80b0: 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72  );.      sNC.pSr
80c0: 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63  cList = pS->pSrc
80d0: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78  ;.      sNC.pNex
80e0: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73  t = pNC;.      s
80f0: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
8100: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a  >pParse;.      z
8110: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
8120: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
8130: 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54  ginDb, &zOriginT
8140: 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29  ab, &zOriginCol)
8150: 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
8160: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
8170: 0a 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67  .  .  if( pzOrig
8180: 69 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65  inDb ){.    asse
8190: 72 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20  rt( pzOriginTab 
81a0: 26 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29  && pzOriginCol )
81b0: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44  ;.    *pzOriginD
81c0: 62 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20  b = zOriginDb;. 
81d0: 20 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20     *pzOriginTab 
81e0: 3d 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20  = zOriginTab;.  
81f0: 20 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d    *pzOriginCol =
8200: 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d   zOriginCol;.  }
8210: 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b  .  return zType;
8220: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
8230: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
8240: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
8250: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
8260: 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  types of columns
8270: 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c  .** in the resul
8280: 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t set..*/.static
8290: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
82a0: 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72  lumnTypes(.  Par
82b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
82c0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
82d0: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
82e0: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
82f0: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
8300: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
8310: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
8320: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
8330: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
8340: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
8350: 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
8360: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
8370: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
8380: 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t i;.  NameConte
8390: 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53  xt sNC;.  sNC.pS
83a0: 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
83b0: 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20  t;.  sNC.pParse 
83c0: 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28  = pParse;.  for(
83d0: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
83e0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
83f0: 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
8400: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
8410: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
8420: 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ype;.#ifdef SQLI
8430: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
8440: 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f  _METADATA.    co
8450: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44  nst char *zOrigD
8460: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
8470: 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20   char *zOrigTab 
8480: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
8490: 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20  har *zOrigCol = 
84a0: 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63  0;.    zType = c
84b0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
84c0: 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f  p, &zOrigDb, &zO
84d0: 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f  rigTab, &zOrigCo
84e0: 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  l);..    /* The 
84f0: 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69  vdbe must make i
8500: 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74  ts own copy of t
8510: 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61  he column-type a
8520: 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a  nd other .    **
8530: 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63   column specific
8540: 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73   strings, in cas
8550: 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  e the schema is 
8560: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
8570: 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  s.    ** virtual
8580: 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65   machine is dele
8590: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
85a0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
85b0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
85c0: 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f  AME_DATABASE, zO
85d0: 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52  rigDb, SQLITE_TR
85e0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
85f0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8600: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8610: 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61  E_TABLE, zOrigTa
8620: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
8630: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
8640: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8650: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f  v, i, COLNAME_CO
8660: 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20  LUMN, zOrigCol, 
8670: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
8680: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79  );.#else.    zTy
8690: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
86a0: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
86b0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
86c0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
86d0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
86e0: 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70  E_DECLTYPE, zTyp
86f0: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
8700: 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ENT);.  }.#endif
8710: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
8720: 44 45 43 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a 2f  DECLTYPE */.}../
8730: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
8740: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
8750: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e  l the VDBE the n
8760: 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ames of columns.
8770: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
8780: 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f   set.  This info
8790: 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
87a0: 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a  to provide the.*
87b0: 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73  * azCol[] values
87c0: 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   in the callback
87d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
87e0: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
87f0: 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ames(.  Parse *p
8800: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
8810: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
8820: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
8830: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
8840: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
8850: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
8860: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
8870: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
8880: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20  sult set */.){. 
8890: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
88a0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
88b0: 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20  i, j;.  sqlite3 
88c0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
88d0: 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65  ;.  int fullName
88e0: 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a  s, shortNames;..
88f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8900: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a  MIT_EXPLAIN.  /*
8910: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
8920: 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69  XPLAIN, skip thi
8930: 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20  s step */.  if( 
8940: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
8950: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
8960: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
8970: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 69  ert( v!=0 );.  i
8980: 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  f( pParse->colNa
8990: 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56 45 52 28  mesSet || NEVER(
89a0: 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c  v==0) || db->mal
89b0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
89c0: 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f  rn;.  pParse->co
89d0: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
89e0: 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62   fullNames = (db
89f0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
8a00: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
8a10: 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20  0;.  shortNames 
8a20: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
8a30: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
8a40: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  mes)!=0;.  sqlit
8a50: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
8a60: 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
8a70: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
8a80: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
8a90: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
8aa0: 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  p;.    p = pELis
8ab0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
8ac0: 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f     if( p==0 ) co
8ad0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
8ae0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
8af0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  me ){.      char
8b00: 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   *zName = pEList
8b10: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
8b20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8b30: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
8b40: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
8b50: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  ame, SQLITE_TRAN
8b60: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73  SIENT);.    }els
8b70: 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b  e if( (p->op==TK
8b80: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70  _COLUMN || p->op
8b90: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29  ==TK_AGG_COLUMN)
8ba0: 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a   && pTabList ){.
8bb0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
8bc0: 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  b;.      char *z
8bd0: 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Col;.      int i
8be0: 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e  Col = p->iColumn
8bf0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
8c00: 20 41 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c 69   ALWAYS(j<pTabLi
8c10: 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b  st->nSrc); j++){
8c20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61  .        if( pTa
8c30: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
8c40: 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29  sor==p->iTable )
8c50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
8c60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
8c70: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
8c80: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
8c90: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
8ca0: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  ab;.      if( iC
8cb0: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
8cc0: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
8cd0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
8ce0: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
8cf0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
8d00: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ) );.      if( i
8d10: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
8d20: 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b   zCol = "rowid";
8d30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8d40: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61        zCol = pTa
8d50: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
8d60: 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
8d70: 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d     if( !shortNam
8d80: 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73  es && !fullNames
8d90: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8da0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8db0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8dc0: 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20  NAME, .         
8dd0: 20 20 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e     sqlite3DbStrN
8de0: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
8df0: 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61  ->span.z, p->spa
8e00: 6e 2e 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e  n.n), SQLITE_DYN
8e10: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
8e20: 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73  se if( fullNames
8e30: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
8e40: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
8e50: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
8e60: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
8e70: 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a  "%s.%s", pTab->z
8e80: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  Name, zCol);.   
8e90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8ea0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
8eb0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
8ec0: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e  Name, SQLITE_DYN
8ed0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
8ee0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
8ef0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8f00: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8f10: 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49  NAME, zCol, SQLI
8f20: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
8f30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
8f40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8f50: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8f60: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
8f70: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
8f80: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
8f90: 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e  , (char*)p->span
8fa0: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 2c 20  .z, p->span.n), 
8fb0: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
8fc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e  .    }.  }.  gen
8fd0: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
8fe0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
8ff0: 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23  t, pEList);.}..#
9000: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9010: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
9020: 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66  CT./*.** Name of
9030: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
9040: 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66  operator, used f
9050: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
9060: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
9070: 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f  st char *selectO
9080: 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20  pName(int id){. 
9090: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74   char *z;.  swit
90a0: 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61  ch( id ){.    ca
90b0: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20  se TK_ALL:      
90c0: 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22   z = "UNION ALL"
90d0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
90e0: 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
90f0: 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54  : z = "INTERSECT
9100: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
9110: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
9120: 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b     z = "EXCEPT";
9130: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9140: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
9150: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b      z = "UNION";
9160: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9170: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
9180: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9190: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
91a0: 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
91b0: 47 69 76 65 6e 20 61 20 61 6e 20 65 78 70 72 65  Given a an expre
91c0: 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63  ssion list (whic
91d0: 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  h is really the 
91e0: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
91f0: 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d  ons.** that form
9200: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
9210: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
9220: 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61  ement) compute a
9230: 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f  ppropriate.** co
9240: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61  lumn names for a
9250: 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c   table that woul
9260: 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  d hold the expre
9270: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
9280: 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * All column nam
9290: 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75  es will be uniqu
92a0: 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  e..**.** Only th
92b0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
92c0: 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f  re computed.  Co
92d0: 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75  lumn.zType, Colu
92e0: 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64  mn.zColl,.** and
92f0: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
9300: 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f   Column are zero
9310: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
9320: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
9330: 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d  ccess.  If a mem
9340: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
9350: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
9360: 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70  store NULL in *p
9370: 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70  aCol and 0 in *p
9380: 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  nCol and return 
9390: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f  SQLITE_NOMEM..*/
93a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
93b0: 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
93c0: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
93d0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
93e0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
93f0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
9400: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
9410: 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72   /* Expr list fr
9420: 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69  om which to deri
9430: 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
9440: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c  */.  int *pnCol,
9450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9460: 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
9470: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65   of columns here
9480: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70   */.  Column **p
9490: 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  aCol          /*
94a0: 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63   Write the new c
94b0: 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20  olumn list here 
94c0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
94d0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
94e0: 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ;   /* Database 
94f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
9500: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
9510: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9520: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
9530: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
9540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9550: 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20   Index added to 
9560: 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e  make the name un
9570: 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  ique */.  Column
9580: 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20   *aCol, *pCol;  
9590: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
95a0: 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74  ping over result
95b0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
95c0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
95d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
95e0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
95f0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
9600: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20   */.  Expr *p;  
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9620: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
9630: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73  for a single res
9640: 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ult column */.  
9650: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
9660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
9670: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
9680: 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
9690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
96a0: 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a  ize of name in z
96b0: 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 2a 70 6e  Name[] */..  *pn
96c0: 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d 20 70 45 4c  Col = nCol = pEL
96d0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 43  ist->nExpr;.  aC
96e0: 6f 6c 20 3d 20 2a 70 61 43 6f 6c 20 3d 20 73 71  ol = *paCol = sq
96f0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
9700: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f  o(db, sizeof(aCo
9710: 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 69  l[0])*nCol);.  i
9720: 66 28 20 61 43 6f 6c 3d 3d 30 20 29 20 72 65 74  f( aCol==0 ) ret
9730: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9740: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ;.  for(i=0, pCo
9750: 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  l=aCol; i<nCol; 
9760: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
9770: 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72    /* Get an appr
9780: 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72  opriate name for
9790: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   the column.    
97a0: 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  */.    p = pELis
97b0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
97c0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
97d0: 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  ight==0 || p->pR
97e0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  ight->token.z==0
97f0: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74   || p->pRight->t
9800: 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a  oken.z[0]!=0 );.
9810: 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
9820: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
9830: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
9840: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
9850: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
9860: 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
9870: 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
9880: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
9890: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
98a0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e  3DbStrDup(db, zN
98b0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
98c0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f  .      Expr *pCo
98d0: 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54  lExpr = p;  /* T
98e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
98f0: 61 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  at is the result
9900: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   column name */.
9910: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
9920: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  b;         /* Ta
9930: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
9940: 69 74 68 20 74 68 69 73 20 65 78 70 72 65 73 73  ith this express
9950: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  ion */.      whi
9960: 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  le( pColExpr->op
9970: 3d 3d 54 4b 5f 44 4f 54 20 29 20 70 43 6f 6c 45  ==TK_DOT ) pColE
9980: 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  xpr = pColExpr->
9990: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  pRight;.      if
99a0: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
99b0: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 28 70 54  TK_COLUMN && (pT
99c0: 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  ab = pColExpr->p
99d0: 54 61 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Tab)!=0 ){.     
99e0: 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
99f0: 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  s use the column
9a00: 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   name name */.  
9a10: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
9a20: 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75   pColExpr->iColu
9a30: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  mn;.        if( 
9a40: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
9a50: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
9a60: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
9a70: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
9a80: 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  "%s",.          
9a90: 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f         iCol>=0 ?
9aa0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
9ab0: 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64  ].zName : "rowid
9ac0: 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ");.      }else{
9ad0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  .        /* Use 
9ae0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78  the original tex
9af0: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
9b00: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74  expression as it
9b10: 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  s name */.      
9b20: 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20    Token *pToken 
9b30: 3d 20 28 70 43 6f 6c 45 78 70 72 2d 3e 73 70 61  = (pColExpr->spa
9b40: 6e 2e 7a 3f 26 70 43 6f 6c 45 78 70 72 2d 3e 73  n.z?&pColExpr->s
9b50: 70 61 6e 3a 26 70 43 6f 6c 45 78 70 72 2d 3e 74  pan:&pColExpr->t
9b60: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7a  oken);.        z
9b70: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
9b80: 72 69 6e 74 66 28 64 62 2c 20 22 25 54 22 2c 20  rintf(db, "%T", 
9b90: 70 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  pToken);.      }
9ba0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
9bb0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9bc0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9bd0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
9be0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9bf0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9c00: 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  3Dequote(zName);
9c10: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
9c20: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  re the column na
9c30: 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49  me is unique.  I
9c40: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f  f the name is no
9c50: 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a  t unique,.    **
9c60: 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65   append a intege
9c70: 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f  r to the name so
9c80: 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73   that it becomes
9c90: 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a   unique..    */.
9ca0: 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69      nName = sqli
9cb0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
9cc0: 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e  e);.    for(j=cn
9cd0: 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  t=0; j<i; j++){.
9ce0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9cf0: 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d  3StrICmp(aCol[j]
9d00: 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
9d10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
9d20: 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20  r *zNewName;.   
9d30: 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65       zName[nName
9d40: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  ] = 0;.        z
9d50: 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  NewName = sqlite
9d60: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
9d70: 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  :%d", zName, ++c
9d80: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
9d90: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
9da0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7a  Name);.        z
9db0: 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b  Name = zNewName;
9dc0: 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b  .        j = -1;
9dd0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61  .        if( zNa
9de0: 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  me==0 ) break;. 
9df0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9e00: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
9e10: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Name;.  }.  if( 
9e20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9e30: 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   ){.    for(j=0;
9e40: 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<i; j++){.    
9e50: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9e60: 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  db, aCol[j].zNam
9e70: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
9e80: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9e90: 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f  aCol);.    *paCo
9ea0: 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f  l = 0;.    *pnCo
9eb0: 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  l = 0;.    retur
9ec0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
9ed0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
9ee0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
9ef0: 20 41 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f   Add type and co
9f00: 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
9f10: 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20  ion to a column 
9f20: 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  list based on.**
9f30: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
9f40: 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  ent..** .** The 
9f50: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73  column list pres
9f60: 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d  umably came from
9f70: 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d   selectColumnNam
9f80: 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29  esFromExprList()
9f90: 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20  ..** The column 
9fa0: 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61  list has only na
9fb0: 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f  mes, not types o
9fc0: 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54  r collations.  T
9fd0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  his.** routine g
9fe0: 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20  oes through and 
9ff0: 61 64 64 73 20 74 68 65 20 74 79 70 65 73 20 61  adds the types a
a000: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a  nd collations..*
a010: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a020: 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20  e requires that 
a030: 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20  all identifiers 
a040: 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a  in the SELECT.**
a050: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65   statement be re
a060: 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  solved..*/.stati
a070: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64  c void selectAdd
a080: 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
a090: 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20  lation(.  Parse 
a0a0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
a0b0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
a0c0: 78 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  xts */.  int nCo
a0d0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
a0e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
a0f0: 6d 6e 73 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20  mns */.  Column 
a100: 2a 61 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 2f  *aCol,         /
a110: 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
a120: 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
a130: 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20  Select       /* 
a140: 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64  SELECT used to d
a150: 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61  etermine types a
a160: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f  nd collations */
a170: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
a180: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
a190: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
a1a0: 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  C;.  Column *pCo
a1b0: 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  l;.  CollSeq *pC
a1c0: 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  oll;.  int i;.  
a1d0: 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63  Expr *p;.  struc
a1e0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
a1f0: 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *a;..  assert( p
a200: 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61  Select!=0 );.  a
a210: 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d  ssert( (pSelect-
a220: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
a230: 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20  esolved)!=0 );. 
a240: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 70   assert( nCol==p
a250: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
a260: 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  nExpr || db->mal
a270: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
a280: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
a290: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
a2a0: 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
a2b0: 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
a2c0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
a2d0: 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
a2e0: 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  a = pSelect->pEL
a2f0: 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  ist->a;.  for(i=
a300: 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c  0, pCol=aCol; i<
a310: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
a320: 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d  +){.    p = a[i]
a330: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c  .pExpr;.    pCol
a340: 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65  ->zType = sqlite
a350: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f  3DbStrDup(db, co
a360: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
a370: 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20  , 0, 0, 0));.   
a380: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
a390: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
a3a0: 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 70 43  inity(p);.    pC
a3b0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
a3c0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
a3d0: 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   p);.    if( pCo
a3e0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  ll ){.      pCol
a3f0: 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ->zColl = sqlite
a400: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43  3DbStrDup(db, pC
a410: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
a420: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
a430: 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
a440: 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
a450: 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
a460: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
a470: 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
a480: 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
a490: 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
a4a0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
a4b0: 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
a4c0: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
a4d0: 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
a4e0: 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
a4f0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
a500: 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  >db;.  int saved
a510: 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46  Flags;..  savedF
a520: 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73  lags = db->flags
a530: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
a540: 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c   ~SQLITE_FullCol
a550: 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  Names;.  db->fla
a560: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
a570: 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71  rtColNames;.  sq
a580: 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
a590: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
a5a0: 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   0);.  if( pPars
a5b0: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
a5c0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65   0;.  while( pSe
a5d0: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  lect->pPrior ) p
a5e0: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
a5f0: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e  ->pPrior;.  db->
a600: 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61  flags = savedFla
a610: 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  gs;.  pTab = sql
a620: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
a630: 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
a640: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
a650: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
a660: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  n 0;.  }.  pTab-
a670: 3e 64 62 4d 65 6d 20 3d 20 64 62 2d 3e 6c 6f 6f  >dbMem = db->loo
a680: 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20  kaside.bEnabled 
a690: 3f 20 64 62 20 3a 20 30 3b 0a 20 20 70 54 61 62  ? db : 0;.  pTab
a6a0: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54  ->nRef = 1;.  pT
a6b0: 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ab->zName = 0;. 
a6c0: 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
a6d0: 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
a6e0: 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  e, pSelect->pELi
a6f0: 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
a700: 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
a710: 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
a720: 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
a730: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e  (pParse, pTab->n
a740: 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c  Col, pTab->aCol,
a750: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61   pSelect);.  pTa
a760: 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
a770: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
a780: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
a790: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
a7a0: 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72  pTab);.    retur
a7b0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
a7c0: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
a7d0: 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20   Get a VDBE for 
a7e0: 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72  the given parser
a7f0: 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74   context.  Creat
a800: 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
a810: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20  ecessary..** If 
a820: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
a830: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64   return NULL and
a840: 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65   leave a message
a850: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56   in pParse..*/.V
a860: 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56  dbe *sqlite3GetV
a870: 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  dbe(Parse *pPars
a880: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
a890: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
a8a0: 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
a8b0: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
a8c0: 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  be = sqlite3Vdbe
a8d0: 43 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64  Create(pParse->d
a8e0: 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  b);.#ifndef SQLI
a8f0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20  TE_OMIT_TRACE.  
a900: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20    if( v ){.     
a910: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a920: 70 30 28 76 2c 20 4f 50 5f 54 72 61 63 65 29 3b  p0(v, OP_Trace);
a930: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
a940: 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a  }.  return v;.}.
a950: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
a960: 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  the iLimit and i
a970: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66  Offset fields of
a980: 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65   the SELECT base
a990: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d  d on the.** pLim
a9a0: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65  it and pOffset e
a9b0: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69  xpressions.  pLi
a9c0: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
a9d0: 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
a9e0: 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70  ions.** that app
a9f0: 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69  ear in the origi
aa00: 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
aa10: 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49  t after the LIMI
aa20: 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20  T and OFFSET.** 
aa30: 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55  keywords.  Or NU
aa40: 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77  LL if those keyw
aa50: 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64  ords are omitted
aa60: 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  . iLimit and iOf
aa70: 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65  fset .** are the
aa80: 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20   integer memory 
aa90: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
aaa0: 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73   for counters us
aab0: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a  ed to compute .*
aac0: 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20  * the limit and 
aad0: 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72  offset.  If ther
aae0: 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e  e is no limit an
aaf0: 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65  d/or offset, the
ab00: 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64  n .** iLimit and
ab10: 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67   iOffset are neg
ab20: 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ative..**.** Thi
ab30: 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65  s routine change
ab40: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  s the values of 
ab50: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
ab60: 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20  et only if.** a 
ab70: 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20  limit or offset 
ab80: 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c  is defined by pL
ab90: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
aba0: 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a  .  iLimit and.**
abb0: 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20   iOffset should 
abc0: 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74  have been preset
abd0: 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   to appropriate 
abe0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a  default values.*
abf0: 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e  * (usually but n
ac00: 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72  ot always -1) pr
ac10: 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
ac20: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20  his routine..** 
ac30: 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d  Only if pLimit!=
ac40: 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20  0 or pOffset!=0 
ac50: 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  do the limit reg
ac60: 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65  isters get.** re
ac70: 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e  defined.  The UN
ac80: 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
ac90: 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65   uses this prope
aca0: 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20  rty to force.** 
acb0: 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65  the reuse of the
acc0: 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20   same limit and 
acd0: 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73  offset registers
ace0: 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65   across multiple
acf0: 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
ad00: 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
ad10: 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d   void computeLim
ad20: 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73  itRegisters(Pars
ad30: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
ad40: 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b  t *p, int iBreak
ad50: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30  ){.  Vdbe *v = 0
ad60: 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d  ;.  int iLimit =
ad70: 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   0;.  int iOffse
ad80: 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a  t;.  int addr1;.
ad90: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
ada0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
adb0: 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22  .  ** "LIMIT -1"
adc0: 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c   always shows al
add0: 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69  l rows.  There i
ade0: 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74  s some.  ** cont
adf0: 72 61 76 65 72 73 79 20 61 62 6f 75 74 20 77 68  raversy about wh
ae00: 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
ae10: 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62  ehavior should b
ae20: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72  e..  ** The curr
ae30: 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
ae40: 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c  on interprets "L
ae50: 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a  IMIT 0" to mean.
ae60: 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20    ** no rows..  
ae70: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  */.  if( p->pLim
ae80: 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69  it ){.    p->iLi
ae90: 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b  mit = iLimit = +
aea0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
aeb0: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
aec0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
aed0: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
aee0: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
aef0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
af00: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69  , p->pLimit, iLi
af10: 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mit);.    sqlite
af20: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
af30: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69  P_MustBeInt, iLi
af40: 6d 69 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  mit);.    VdbeCo
af50: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
af60: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
af70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
af80: 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p2(v, OP_IfZero,
af90: 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29   iLimit, iBreak)
afa0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
afb0: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 70 2d  Offset ){.    p-
afc0: 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73  >iOffset = iOffs
afd0: 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
afe0: 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  Mem;.    if( p->
aff0: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  pLimit ){.      
b000: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20  pParse->nMem++; 
b010: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
b020: 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20   extra register 
b030: 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74  for limit+offset
b040: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 76 20   */.    }.    v 
b050: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
b060: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
b070: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
b080: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
b090: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  Code(pParse, p->
b0a0: 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74  pOffset, iOffset
b0b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
b0c0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
b0d0: 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65  ustBeInt, iOffse
b0e0: 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  t);.    VdbeComm
b0f0: 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20  ent((v, "OFFSET 
b100: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
b110: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
b120: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
b130: 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b  IfPos, iOffset);
b140: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b150: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
b160: 65 67 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74  eger, 0, iOffset
b170: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
b180: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
b190: 64 72 31 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  dr1);.    if( p-
b1a0: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >pLimit ){.     
b1b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b1c0: 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c  p3(v, OP_Add, iL
b1d0: 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c 20 69  imit, iOffset, i
b1e0: 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20  Offset+1);.     
b1f0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
b200: 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29   "LIMIT+OFFSET")
b210: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d  );.      addr1 =
b220: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b230: 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
b240: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73  iLimit);.      s
b250: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b260: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
b270: 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a  -1, iOffset+1);.
b280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b290: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
b2a0: 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  r1);.    }.  }.}
b2b0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b2c0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
b2d0: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ELECT./*.** Retu
b2e0: 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
b2f0: 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
b300: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43  uence for the iC
b310: 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a  ol-th column of.
b320: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
b330: 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  t for the compou
b340: 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd-select statem
b350: 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e  ent "p".  Return
b360: 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20   NULL if.** the 
b370: 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65  column has no de
b380: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
b390: 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
b3a0: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
b3b0: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63  quence for the c
b3c0: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69  ompound select i
b3d0: 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65  s taken from the
b3e0: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  .** left-most te
b3f0: 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  rm of the select
b400: 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c   that has a coll
b410: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
b420: 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65  */.static CollSe
b430: 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f  q *multiSelectCo
b440: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
b450: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
b460: 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c  int iCol){.  Col
b470: 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66  lSeq *pRet;.  if
b480: 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
b490: 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53     pRet = multiS
b4a0: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
b4b0: 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  rse, p->pPrior, 
b4c0: 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCol);.  }else{.
b4d0: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
b4e0: 7d 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20  }.  if( pRet==0 
b4f0: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  ){.    pRet = sq
b500: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
b510: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
b520: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
b530: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
b540: 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20   pRet;.}.#endif 
b550: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
b560: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
b570: 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  /../* Forward re
b580: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
b590: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
b5a0: 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  tOrderBy(.  Pars
b5b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
b5c0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
b5d0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
b5e0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
b5f0: 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
b600: 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
b610: 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
b620: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
b630: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
b640: 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
b650: 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66  ults */.);...#if
b660: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b670: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
b680: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
b690: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
b6a0: 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f   process a compo
b6b0: 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66  und query form f
b6c0: 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f  rom.** two or mo
b6d0: 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72  re separate quer
b6e0: 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c  ies using UNION,
b6f0: 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45   UNION ALL, EXCE
b700: 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53  PT, or.** INTERS
b710: 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f  ECT.**.** "p" po
b720: 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68  ints to the righ
b730: 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77  t-most of the tw
b740: 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20  o queries.  the 
b750: 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20  query on the.** 
b760: 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f  left is p->pPrio
b770: 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65  r.  The left que
b780: 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65  ry could also be
b790: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
b7a0: 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61  y.** in which ca
b7b0: 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
b7c0: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72  will be called r
b7d0: 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a  ecursively. .**.
b7e0: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f  ** The results o
b7f0: 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
b800: 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74  y are to be writ
b810: 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69  ten into a desti
b820: 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70  nation.** of typ
b830: 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72  e eDest with par
b840: 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a  ameter iParm..**
b850: 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
b860: 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65  Consider a three
b870: 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51  -way compound SQ
b880: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  L statement..**.
b890: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
b8a0: 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
b8b0: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55  LECT b FROM t2 U
b8c0: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52  NION SELECT c FR
b8d0: 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73  OM t3.**.** This
b8e0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
b8f0: 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f  rsed up as follo
b900: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ws:.**.**     SE
b910: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
b920: 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  *      |.**     
b930: 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54   `----->  SELECT
b940: 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20   b FROM t2.**   
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a               |.*
b960: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
b970: 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43   `------>  SELEC
b980: 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a  T a FROM t1.**.*
b990: 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20  * The arrows in 
b9a0: 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76  the diagram abov
b9b0: 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  e represent the 
b9c0: 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f  Select.pPrior po
b9d0: 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20  inter..** So if 
b9e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
b9f0: 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71  called with p eq
ba00: 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75  ual to the t3 qu
ba10: 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72  ery, then.** pPr
ba20: 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ior will be the 
ba30: 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70  t2 query.  p->op
ba40: 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f   will be TK_UNIO
ba50: 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  N in this case..
ba60: 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61  **.** Notice tha
ba70: 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  t because of the
ba80: 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73   way SQLite pars
ba90: 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  es compound SELE
baa0: 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69  CTs, the.** indi
bab0: 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61  vidual selects a
bac0: 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d  lways group from
bad0: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a   left to right..
bae0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
baf0: 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72  ltiSelect(.  Par
bb00: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
bb10: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
bb20: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
bb30: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
bb40: 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
bb50: 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
bb60: 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
bb70: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
bb80: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
bb90: 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
bba0: 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
bbb0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bbc0: 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63  ;   /* Success c
bbd0: 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f  ode from a subro
bbe0: 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63  utine */.  Selec
bbf0: 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
bc00: 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
bc10: 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
bc20: 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
bc30: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
bc40: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
bc50: 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
bc60: 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
bc70: 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f  est dest;      /
bc80: 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61  * Alternative da
bc90: 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a  ta destination *
bca0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c  /.  Select *pDel
bcb0: 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61  ete = 0;  /* Cha
bcc0: 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c  in of simple sel
bcd0: 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a  ects to delete *
bce0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
bcf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
bd00: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
bd10: 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73   */..  /* Make s
bd20: 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ure there is no 
bd30: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
bd40: 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f  T clause on prio
bd50: 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79  r SELECTs.  Only
bd60: 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28  .  ** the last (
bd70: 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45  right-most) SELE
bd80: 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73  CT in the series
bd90: 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44   may have an ORD
bda0: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a  ER BY or LIMIT..
bdb0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
bdc0: 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b   && p->pPrior );
bdd0: 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e    /* Calling fun
bde0: 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73  ction guarantees
bdf0: 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20   this much */.  
be00: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
be10: 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
be20: 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
be30: 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d   pPrior->pRightm
be40: 6f 73 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20  ost!=pPrior );. 
be50: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
be60: 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e  >pRightmost==p->
be70: 70 52 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20  pRightmost );.  
be80: 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20  dest = *pDest;. 
be90: 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72   if( pPrior->pOr
bea0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
beb0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
bec0: 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c  rse,"ORDER BY cl
bed0: 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
bee0: 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65   after %s not be
bef0: 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c  fore",.      sel
bf00: 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
bf10: 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
bf20: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
bf30: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
bf40: 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  if( pPrior->pLim
bf50: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
bf60: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
bf70: 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73  ,"LIMIT clause s
bf80: 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
bf90: 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
bfa0: 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
bfb0: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
bfc0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
bfd0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
bfe0: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73  nd;.  }..  v = s
bff0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
c000: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
c010: 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65   v!=0 );  /* The
c020: 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 63 72   VDBE already cr
c030: 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  eated by calling
c040: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20   function */..  
c050: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65  /* Create the de
c060: 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72  stination tempor
c070: 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63  ary table if nec
c080: 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66  essary.  */.  if
c090: 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
c0a0: 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
c0b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
c0c0: 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ist );.    sqlit
c0d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c0e0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
c0f0: 2c 20 64 65 73 74 2e 69 50 61 72 6d 2c 20 70 2d  , dest.iParm, p-
c100: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
c110: 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20  .    dest.eDest 
c120: 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d  = SRT_Table;.  }
c130: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
c140: 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20   all SELECTs in 
c150: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
c160: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
c170: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20  er of elements. 
c180: 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73   ** in their res
c190: 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20  ult sets..  */. 
c1a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
c1b0: 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
c1c0: 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d  List );.  if( p-
c1d0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
c1e0: 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
c1f0: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
c200: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c210: 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f  rse, "SELECTs to
c220: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
c230: 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20  ght of %s".     
c240: 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
c250: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
c260: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
c270: 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
c280: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
c290: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
c2a0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
c2b0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75    }..  /* Compou
c2c0: 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61 74 20  nd SELECTs that 
c2d0: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
c2e0: 20 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64   clause are hand
c2f0: 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a  led separately..
c300: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f    */.  if( p->pO
c310: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65  rderBy ){.    re
c320: 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  turn multiSelect
c330: 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20  OrderBy(pParse, 
c340: 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  p, pDest);.  }..
c350: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
c360: 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
c370: 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
c380: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
c390: 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  /.  switch( p->o
c3a0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
c3b0: 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _ALL: {.      in
c3c0: 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  t addr = 0;.    
c3d0: 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
c3e0: 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20  r->pLimit );.   
c3f0: 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69     pPrior->pLimi
c400: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
c410: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66       pPrior->pOf
c420: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
c430: 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  t;.      rc = sq
c440: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
c450: 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
c460: 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
c470: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
c480: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
c490: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
c4a0: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
c4b0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
c4c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
c4d0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
c4e0: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72   p->iLimit = pPr
c4f0: 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ior->iLimit;.   
c500: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
c510: 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b  pPrior->iOffset;
c520: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c  .      if( p->iL
c530: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
c540: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
c550: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
c560: 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  fZero, p->iLimit
c570: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
c580: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70  omment((v, "Jump
c590: 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20   ahead if LIMIT 
c5a0: 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20  reached"));.    
c5b0: 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
c5c0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
c5d0: 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
c5e0: 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
c5f0: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
c600: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
c610: 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ior;.      if( r
c620: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
c630: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
c640: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
c650: 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20    if( addr ){.  
c660: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c670: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
c680: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
c690: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c6a0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
c6b0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  T:.    case TK_U
c6c0: 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NION: {.      in
c6d0: 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f  t unionTab;    /
c6e0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
c6f0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
c700: 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
c710: 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75  esult */.      u
c720: 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20  8 op = 0;       
c730: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52  /* One of the SR
c740: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  T_ operations to
c750: 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a   apply to self *
c760: 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f  /.      int prio
c770: 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rOp;     /* The 
c780: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74  SRT_ operation t
c790: 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72  o apply to prior
c7a0: 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20   selects */.    
c7b0: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
c7c0: 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76  *pOffset; /* Sav
c7d0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
c7e0: 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f  nLimit and p->nO
c7f0: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69  ffset */.      i
c800: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
c810: 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64  electDest uniond
c820: 65 73 74 3b 0a 0a 20 20 20 20 20 20 70 72 69 6f  est;..      prio
c830: 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b  rOp = SRT_Union;
c840: 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
c850: 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26  eDest==priorOp &
c860: 26 20 41 4c 57 41 59 53 28 21 70 2d 3e 70 4c 69  & ALWAYS(!p->pLi
c870: 6d 69 74 20 26 26 21 70 2d 3e 70 4f 66 66 73 65  mit &&!p->pOffse
c880: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  t) ){.        /*
c890: 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20   We can reuse a 
c8a0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
c8b0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53  generated by a S
c8c0: 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20  ELECT to our.   
c8d0: 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20       ** right.. 
c8e0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
c8f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
c900: 67 68 74 6d 6f 73 74 21 3d 70 20 29 3b 20 20 2f  ghtmost!=p );  /
c910: 2a 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  * Can only happe
c920: 6e 20 66 6f 72 20 6c 65 66 74 77 61 72 64 20 65  n for leftward e
c930: 6c 65 6d 65 6e 74 73 0a 20 20 20 20 20 20 20 20  lements.        
c940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
c960: 6f 66 20 61 20 33 2d 77 61 79 20 6f 72 20 6d 6f  of a 3-way or mo
c970: 72 65 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20  re compound */. 
c980: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c990: 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20  ->pLimit==0 );  
c9a0: 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77      /* Not allow
c9b0: 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65  ed on leftward e
c9c0: 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  lements */.     
c9d0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
c9e0: 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20  ffset==0 );     
c9f0: 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  /* Not allowed o
ca00: 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  n leftward eleme
ca10: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  nts */.        u
ca20: 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69  nionTab = dest.i
ca30: 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Parm;.      }els
ca40: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  e{.        /* We
ca50: 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72   will need to cr
ca60: 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d  eate our own tem
ca70: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
ca80: 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20  hold the.       
ca90: 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65   ** intermediate
caa0: 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20   results..      
cab0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
cac0: 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  onTab = pParse->
cad0: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
cae0: 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
caf0: 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
cb00: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
cb10: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
cb20: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
cb30: 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
cb40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
cb50: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
cb60: 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
cb70: 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
cb80: 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
cb90: 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f       p->pRightmo
cba0: 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  st->selFlags |= 
cbb0: 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
cbc0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
cbd0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
cbe0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
cbf0: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
cc00: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
cc10: 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f  ur left.      */
cc20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
cc30: 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
cc40: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
cc50: 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
cc60: 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f  &uniondest, prio
cc70: 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a  rOp, unionTab);.
cc80: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
cc90: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
cca0: 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64   pPrior, &uniond
ccb0: 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
ccc0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
ccd0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
cce0: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
ccf0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
cd00: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73  current SELECT s
cd10: 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a  tatement.      *
cd20: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f  /.      if( p->o
cd30: 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a  p==TK_EXCEPT ){.
cd40: 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54          op = SRT
cd50: 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d  _Except;.      }
cd60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
cd70: 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
cd80: 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20  UNION );.       
cd90: 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b   op = SRT_Union;
cda0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
cdb0: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
cdc0: 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e      pLimit = p->
cdd0: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
cde0: 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
cdf0: 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e     pOffset = p->
ce00: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
ce10: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
ce20: 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65       uniondest.e
ce30: 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20  Dest = op;.     
ce40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
ce50: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
ce60: 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20  uniondest);.    
ce70: 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74    /* Query flatt
ce80: 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33  ening in sqlite3
ce90: 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72  Select() might r
cea0: 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42  efill p->pOrderB
ceb0: 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73  y..      ** Be s
cec0: 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d  ure to delete p-
ced0: 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65  >pOrderBy, there
cee0: 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61  fore, to avoid a
cef0: 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f   memory leak. */
cf00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
cf10: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
cf20: 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
cf30: 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
cf40: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
cf50: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
cf60: 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  or;.      p->pOr
cf70: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
cf80: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
cf90: 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
cfa0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
cfb0: 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
cfc0: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
cfd0: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
cfe0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
cff0: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
d000: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
d010: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
d020: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
d030: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20  d;.      }...   
d040: 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68     /* Convert th
d050: 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65  e data in the te
d060: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e  mporary table in
d070: 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
d080: 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20  .      ** it is 
d090: 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c  that we currentl
d0a0: 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  y need..      */
d0b0: 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
d0c0: 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
d0d0: 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62  orOp || unionTab
d0e0: 21 3d 64 65 73 74 2e 69 50 61 72 6d 20 29 7b 0a  !=dest.iParm ){.
d0f0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
d100: 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
d110: 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
d120: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
d130: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74          if( dest
d140: 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  .eDest==SRT_Outp
d150: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ut ){.          
d160: 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
d170: 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68   p;.          wh
d180: 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
d190: 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
d1a0: 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
d1b0: 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74           generat
d1c0: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
d1d0: 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
d1e0: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  pEList);.       
d1f0: 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61   }.        iBrea
d200: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
d210: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
d220: 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
d230: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
d240: 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  l(v);.        co
d250: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
d260: 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
d270: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
d280: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d290: 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
d2a0: 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
d2b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
d2c0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
d2d0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
d2e0: 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e         selectInn
d2f0: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
d300: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69  , p->pEList, uni
d310: 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74  onTab, p->pEList
d320: 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 20 30 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69   0, -1, &dest, i
d350: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
d360: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d370: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
d380: 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
d390: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d3a0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
d3b0: 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
d3c0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d3d0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
d3e0: 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
d3f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d400: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
d410: 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  lose, unionTab, 
d420: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
d430: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d440: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
d450: 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  SECT: {.      in
d460: 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20  t tab1, tab2;.  
d470: 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
d480: 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
d490: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
d4a0: 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20  t, *pOffset;.   
d4b0: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
d4c0: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e     SelectDest in
d4d0: 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20  tersectdest;.   
d4e0: 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20     int r1;..    
d4f0: 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69    /* INTERSECT i
d500: 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
d510: 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63   the others sinc
d520: 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20  e it requires.  
d530: 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f      ** two tempo
d540: 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65  rary tables.  He
d550: 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f  nce it has its o
d560: 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a  wn case.  Begin.
d570: 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f        ** by allo
d580: 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65  cating the table
d590: 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a  s we will need..
d5a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
d5b0: 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab1 = pParse->nT
d5c0: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32  ab++;.      tab2
d5d0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
d5e0: 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  +;.      assert(
d5f0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
d600: 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d  );..      addr =
d610: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d620: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
d630: 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29  emeral, tab1, 0)
d640: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d650: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
d660: 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
d670: 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
d680: 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
d690: 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
d6a0: 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
d6b0: 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
d6c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
d6d0: 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20  >pEList );..    
d6e0: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
d6f0: 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
d700: 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
d710: 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
d720: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
d730: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
d740: 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65  nit(&intersectde
d750: 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74  st, SRT_Union, t
d760: 61 62 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ab1);.      rc =
d770: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
d780: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
d790: 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
d7a0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
d7b0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
d7c0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d7d0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
d7e0: 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
d7f0: 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
d800: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
d810: 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ab2".      */.  
d820: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
d830: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d840: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
d850: 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
d860: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
d870: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20  rOpenEphm[1] == 
d880: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
d890: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
d8a0: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
d8b0: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
d8c0: 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
d8d0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
d8e0: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
d8f0: 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
d900: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
d910: 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
d920: 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74     intersectdest
d930: 2e 69 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20  .iParm = tab2;. 
d940: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d950: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
d960: 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73  p, &intersectdes
d970: 74 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74  t);.      pDelet
d980: 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
d990: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
d9a0: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73   pPrior;.      s
d9b0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
d9c0: 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
d9d0: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
d9e0: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
d9f0: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
da00: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28  ffset;.      if(
da10: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
da20: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
da30: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
da40: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
da50: 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68   code to take th
da60: 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  e intersection o
da70: 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72  f the two tempor
da80: 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  ary.      ** tab
da90: 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  les..      */.  
daa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
dab0: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69  EList );.      i
dac0: 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
dad0: 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
dae0: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
daf0: 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
db00: 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
db10: 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
db20: 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
db30: 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61  ;.        genera
db40: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
db50: 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
db60: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
db70: 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  }.      iBreak =
db80: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
db90: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
dba0: 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
dbb0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
dbc0: 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69  .      computeLi
dbd0: 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
dbe0: 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
dbf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
dc00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
dc10: 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
dc20: 65 61 6b 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  eak);.      r1 =
dc30: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
dc40: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
dc50: 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
dc60: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
dc70: 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c  OP_RowKey, tab1,
dc80: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
dc90: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
dca0: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
dcb0: 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 29 3b 0a  b2, iCont, r1);.
dcc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
dcd0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
dce0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  se, r1);.      s
dcf0: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
dd00: 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
dd10: 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45  ist, tab1, p->pE
dd20: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd40: 20 20 20 30 2c 20 2d 31 2c 20 26 64 65 73 74 2c     0, -1, &dest,
dd50: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
dd60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
dd70: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
dd80: 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
dd90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dda0: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61  2(v, OP_Next, ta
ddb0: 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  b1, iStart);.   
ddc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
ddd0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
dde0: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
ddf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
de00: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
de10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
de20: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
de30: 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
de40: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
de50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
de60: 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74  * Compute collat
de70: 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
de80: 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70  ed by .  ** temp
de90: 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65  orary tables nee
dea0: 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ded to implement
deb0: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
dec0: 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63  lect..  ** Attac
ded0: 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  h the KeyInfo st
dee0: 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74  ructure to all t
def0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
df00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
df10: 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62  section is run b
df20: 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  y the right-most
df30: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
df40: 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c  t only..  ** SEL
df50: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
df60: 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79  o the left alway
df70: 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  s skip this part
df80: 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
df90: 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69  t.  ** SELECT mi
dfa0: 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68  ght also skip th
dfb0: 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61  is part if it ha
dfc0: 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
dfd0: 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f  ause and.  ** no
dfe0: 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65   temp tables are
dff0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
e000: 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
e010: 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d  s & SF_UsesEphem
e020: 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  eral ){.    int 
e030: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
e050: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
e060: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
e070: 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
e080: 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
e090: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73  ence for the res
e0a0: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53  ult set */.    S
e0b0: 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20  elect *pLoop;   
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e0d0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
e0e0: 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65  ugh SELECT state
e0f0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c  ments */.    Col
e100: 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20  lSeq **apColl;  
e110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
e120: 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
e130: 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  h pKeyInfo->aCol
e140: 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  l[] */.    int n
e150: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
e160: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e170: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
e180: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
e190: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
e1a0: 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a  Rightmost==p );.
e1b0: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45      nCol = p->pE
e1c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
e1d0: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
e1e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
e1f0: 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
e200: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
e210: 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f  f(*pKeyInfo)+nCo
e220: 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  l*(sizeof(CollSe
e230: 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20 20 20 69  q*) + 1));.    i
e240: 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  f( !pKeyInfo ){.
e250: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e260: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
e270: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
e280: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _end;.    }..   
e290: 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d   pKeyInfo->enc =
e2a0: 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 4b   ENC(db);.    pK
e2b0: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d  eyInfo->nField =
e2c0: 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 0a 20 20 20   (u16)nCol;..   
e2d0: 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c   for(i=0, apColl
e2e0: 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  =pKeyInfo->aColl
e2f0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61  ; i<nCol; i++, a
e300: 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  pColl++){.      
e310: 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53  *apColl = multiS
e320: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
e330: 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
e340: 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c    if( 0==*apColl
e350: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43   ){.        *apC
e360: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
e370: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
e380: 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f   }..    for(pLoo
e390: 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  p=p; pLoop; pLoo
e3a0: 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29  p=pLoop->pPrior)
e3b0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
e3c0: 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
e3d0: 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70      int addr = p
e3e0: 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
e3f0: 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hm[i];.        i
e400: 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
e410: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d         /* If [0]
e420: 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20   is unused then 
e430: 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73  [1] is also unus
e440: 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20  ed.  So we can. 
e450: 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61           ** alwa
e460: 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20  ys safely abort 
e470: 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66  as soon as the f
e480: 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74  irst unused slot
e490: 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20   is found */.   
e4a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e4b0: 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
e4c0: 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20  hm[1]<0 );.     
e4d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e4e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
e4f0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
e500: 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29  2(v, addr, nCol)
e510: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
e520: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
e530: 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b   addr, (char*)pK
e540: 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
e550: 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  FO);.        pLo
e560: 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
e570: 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  [i] = -1;.      
e580: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
e590: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4b  te3DbFree(db, pK
e5a0: 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75  eyInfo);.  }..mu
e5b0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a  lti_select_end:.
e5c0: 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20    pDest->iMem = 
e5d0: 64 65 73 74 2e 69 4d 65 6d 3b 0a 20 20 70 44 65  dest.iMem;.  pDe
e5e0: 73 74 2d 3e 6e 4d 65 6d 20 3d 20 64 65 73 74 2e  st->nMem = dest.
e5f0: 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53  nMem;.  sqlite3S
e600: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
e610: 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75  pDelete);.  retu
e620: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
e630: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
e640: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
e650: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  /../*.** Code an
e660: 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
e670: 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69  ne for a corouti
e680: 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ne implementatio
e690: 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54  n of a.** SELECT
e6a0: 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   statment..**.**
e6b0: 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
e6c0: 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69  output is contai
e6d0: 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 4d 65 6d  ned in pIn->iMem
e6e0: 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20  .  There are.** 
e6f0: 70 49 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c 75 6d 6e  pIn->nMem column
e700: 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20  s to be output. 
e710: 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20   pDest is where 
e720: 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c  the output shoul
e730: 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a  d.** be sent..**
e740: 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73  .** regReturn is
e750: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
e760: 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  he register hold
e770: 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69  ing the subrouti
e780: 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64  ne.** return add
e790: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  ress..**.** If r
e7a0: 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74  egPrev>0 then it
e7b0: 20 69 73 20 61 20 74 68 65 20 66 69 72 73 74 20   is a the first 
e7c0: 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65  register in a ve
e7d0: 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63  ctor that.** rec
e7e0: 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  ords the previou
e7f0: 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72  s output.  mem[r
e800: 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61  egPrev] is a fla
e810: 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a  g that is false.
e820: 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20  ** if there has 
e830: 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73  been no previous
e840: 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67   output.  If reg
e850: 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65  Prev>0 then code
e860: 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64   is.** generated
e870: 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70   to suppress dup
e880: 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e  licates.  pKeyIn
e890: 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63  fo is used for c
e8a0: 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73  omparing.** keys
e8b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c  ..**.** If the L
e8c0: 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d  IMIT found in p-
e8d0: 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68  >iLimit is reach
e8e0: 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ed, jump immedia
e8f0: 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61  tely to.** iBrea
e900: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
e910: 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
e920: 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72  ubroutine(.  Par
e930: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e940: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e950: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
e960: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
e970: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
e980: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
e990: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49    SelectDest *pI
e9a0: 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72  n,        /* Cor
e9b0: 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67  outine supplying
e9c0: 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
e9d0: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
e9e0: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
e9f0: 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a  end the data */.
ea00: 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c    int regReturn,
ea10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ea20: 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
ea30: 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
ea40: 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20  t regPrev,      
ea50: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
ea60: 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  s result registe
ea70: 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73  r.  No uniquenes
ea80: 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49  s if 0 */.  KeyI
ea90: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
eaa0: 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61      /* For compa
eab0: 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f  ring with previo
eac0: 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e  us entry */.  in
ead0: 74 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20  t p4type,       
eae0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 34 20        /* The p4 
eaf0: 74 79 70 65 20 66 6f 72 20 70 4b 65 79 49 6e 66  type for pKeyInf
eb00: 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  o */.  int iBrea
eb10: 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
eb20: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
eb30: 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
eb40: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
eb50: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
eb60: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
eb70: 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
eb80: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
eb90: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
eba0: 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
ebb0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
ebc0: 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
ebd0: 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  Suppress duplica
ebe0: 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45  tes for UNION, E
ebf0: 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
ec00: 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28  SECT .  */.  if(
ec10: 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
ec20: 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20  int j1, j2;.    
ec30: 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
ec40: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
ec50: 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20  ot, regPrev);.  
ec60: 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64    j2 = sqlite3Vd
ec70: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
ec80: 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 4d 65  ompare, pIn->iMe
ec90: 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49  m, regPrev+1, pI
eca0: 6e 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20 20  n->nMem,.       
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecc0: 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
ecd0: 65 79 49 6e 66 6f 2c 20 70 34 74 79 70 65 29 3b  eyInfo, p4type);
ece0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ecf0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
ed00: 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e  p, j2+2, iContin
ed10: 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20 73  ue, j2+2);.    s
ed20: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
ed30: 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73  re(v, j1);.    s
ed40: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
ed50: 70 79 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  py(pParse, pIn->
ed60: 69 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c  iMem, regPrev+1,
ed70: 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20   pIn->nMem);.   
ed80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ed90: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
eda0: 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 1, regPrev);. 
edb0: 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
edc0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
edd0: 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  d ) return 0;.. 
ede0: 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65   /* Suppress the
edf0: 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45   the first OFFSE
ee00: 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65  T entries if the
ee10: 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20  re is an OFFSET 
ee20: 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f  clause.  */.  co
ee30: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69  deOffset(v, p, i
ee40: 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77  Continue);..  sw
ee50: 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65  itch( pDest->eDe
ee60: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f  st ){.    /* Sto
ee70: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
ee80: 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
ee90: 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
eea0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
eeb0: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
eec0: 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
eed0: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
eee0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
eef0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
ef00: 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65  t r2 = sqlite3Ge
ef10: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
ef20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ef30: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ef40: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d  MakeRecord, pIn-
ef50: 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d  >iMem, pIn->nMem
ef60: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
ef70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
ef80: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70  , OP_NewRowid, p
ef90: 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72 32 29  Dest->iParm, r2)
efa0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
efb0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
efc0: 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69  Insert, pDest->i
efd0: 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20  Parm, r1, r2);. 
efe0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
eff0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
f000: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
f010: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
f020: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
f030: 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
f040: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
f050: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
f060: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f070: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
f080: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
f090: 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
f0a0: 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66  creating a set f
f0b0: 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28  or an "expr IN (
f0c0: 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e  SELECT ...)" con
f0d0: 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74  struct,.    ** t
f0e0: 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64  hen there should
f0f0: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65   be a single ite
f100: 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
f110: 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20   Write this.    
f120: 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65  ** item into the
f130: 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20   set table with 
f140: 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20  bogus data..    
f150: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
f160: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Set: {.      int
f170: 20 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72   r1;.      asser
f180: 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20  t( pIn->nMem==1 
f190: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69  );.      p->affi
f1a0: 6e 69 74 79 20 3d 20 0a 20 20 20 20 20 20 20 20  nity = .        
f1b0: 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
f1c0: 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73  ffinity(p->pELis
f1d0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70  t->a[0].pExpr, p
f1e0: 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b  Dest->affinity);
f1f0: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
f200: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
f210: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
f220: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
f230: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
f240: 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 2c 20 72   pIn->iMem, 1, r
f250: 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c  1, &p->affinity,
f260: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
f270: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
f280: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
f290: 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 29 3b  , pIn->iMem, 1);
f2a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f2b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
f2c0: 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  dxInsert, pDest-
f2d0: 3e 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20  >iParm, r1);.   
f2e0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
f2f0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
f300: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
f310: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20  k;.    }..#if 0 
f320: 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73   /* Never occurs
f330: 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   on an ORDER BY 
f340: 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20  query */.    /* 
f350: 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74  If any row exist
f360: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
f370: 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20  et, record that 
f380: 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a  fact and abort..
f390: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
f3a0: 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20  SRT_Exists: {.  
f3b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f3c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
f3d0: 67 65 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69  ger, 1, pDest->i
f3e0: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Parm);.      /* 
f3f0: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
f400: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
f410: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
f420: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
f430: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
f440: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
f450: 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
f460: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
f470: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
f480: 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
f490: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
f4a0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
f4b0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
f4c0: 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
f4d0: 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
f4e0: 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
f4f0: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
f500: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
f510: 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20  >nMem==1 );.    
f520: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f530: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
f540: 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e  n->iMem, pDest->
f550: 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
f560: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
f570: 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f  ause will jump o
f580: 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  ut of the loop f
f590: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
f5a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
f5b0: 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
f5c0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
f5d0: 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68  RY */..    /* Th
f5e0: 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  e results are st
f5f0: 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
f600: 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ce of registers.
f610: 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
f620: 61 74 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2e 20  at pDest->iMem. 
f630: 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75   Then the co-rou
f640: 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20  tine yields..   
f650: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
f660: 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20  _Coroutine: {.  
f670: 20 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69      if( pDest->i
f680: 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Mem==0 ){.      
f690: 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20    pDest->iMem = 
f6a0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
f6b0: 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
f6c0: 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  >nMem);.        
f6d0: 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 70 49  pDest->nMem = pI
f6e0: 6e 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d  n->nMem;.      }
f6f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f700: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
f710: 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44  e, pIn->iMem, pD
f720: 65 73 74 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74  est->iMem, pDest
f730: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73  ->nMem);.      s
f740: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
f750: 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44  (v, OP_Yield, pD
f760: 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20  est->iParm);.   
f770: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f780: 0a 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20  .    /* Results 
f790: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
f7a0: 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
f7b0: 73 74 65 72 73 2e 20 20 54 68 65 6e 20 74 68 65  sters.  Then the
f7c0: 0a 20 20 20 20 2a 2a 20 4f 50 5f 52 65 73 75 6c  .    ** OP_Resul
f7d0: 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75  tRow opcode is u
f7e0: 73 65 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c  sed to cause sql
f7f0: 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 20 72  ite3_step() to r
f800: 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 74 68 65  eturn.    ** the
f810: 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73   next row of res
f820: 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ult..    */.    
f830: 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a  case SRT_Output:
f840: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
f850: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f860: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d  _ResultRow, pIn-
f870: 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d  >iMem, pIn->nMem
f880: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f890: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
f8a0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
f8b0: 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e  pIn->iMem, pIn->
f8c0: 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 62 72 65  nMem);.      bre
f8d0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21  ak;.    }..#if !
f8e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
f8f0: 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20  MIT_TRIGGER).   
f900: 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20   /* Discard the 
f910: 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69  results.  This i
f920: 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43  s used for SELEC
f930: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73  T statements ins
f940: 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  ide.    ** the b
f950: 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52  ody of a TRIGGER
f960: 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f  .  The purpose o
f970: 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69  f such selects i
f980: 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  s to call.    **
f990: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
f9a0: 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76  nctions that hav
f9b0: 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20  e side effects. 
f9c0: 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a   We do not care.
f9d0: 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65      ** about the
f9e0: 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20   actual results 
f9f0: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20  of the select.. 
fa00: 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
fa10: 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  t: {.      break
fa20: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
fa30: 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
fa40: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
fa50: 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49  loop if the LIMI
fa60: 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20  T is reached..  
fa70: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  */.  if( p->iLim
fa80: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
fa90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
faa0: 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69  P_AddImm, p->iLi
fab0: 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71  mit, -1);.    sq
fac0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
fad0: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
fae0: 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29  >iLimit, iBreak)
faf0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
fb00: 72 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74  rate the subrout
fb10: 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a  ine return.  */.
fb20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
fb30: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
fb40: 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74  ntinue);.  sqlit
fb50: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
fb60: 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
fb70: 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e  turn);..  return
fb80: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
fb90: 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70  Alternative comp
fba0: 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65  ound select code
fbb0: 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63   generator for c
fbc0: 61 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a  ases when there.
fbd0: 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  ** is an ORDER B
fbe0: 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  Y clause..**.** 
fbf0: 57 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72  We assume a quer
fc00: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
fc10: 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  ng form:.**.**  
fc20: 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c      <selectA>  <
fc30: 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65  operator>  <sele
fc40: 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c  ctB>  ORDER BY <
fc50: 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a  orderbylist>.**.
fc60: 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
fc70: 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c   one of UNION AL
fc80: 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  L, UNION, EXCEPT
fc90: 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20  , or INTERSECT. 
fca0: 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20   The idea.** is 
fcb0: 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65  to code both <se
fcc0: 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65  lectA> and <sele
fcd0: 63 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52  ctB> with the OR
fce0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
fcf0: 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e  .** co-routines.
fd00: 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63    Then run the c
fd10: 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61  o-routines in pa
fd20: 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65  rallel and merge
fd30: 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
fd40: 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  into the output.
fd50: 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f    In addition to
fd60: 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
fd70: 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65  nes (called sele
fd80: 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63  ctA and.** selec
fd90: 74 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20  tB) there are 7 
fda0: 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a  subroutines:.**.
fdb0: 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d  **    outA:    M
fdc0: 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
fdd0: 66 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f  f the selectA co
fde0: 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
fdf0: 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
fe00: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
fe10: 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a  mpound query..**
fe20: 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20  .**    outB:    
fe30: 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20  Move the output 
fe40: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63  of the selectB c
fe50: 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68  oroutine into th
fe60: 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20  e output.**     
fe70: 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
fe80: 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20  ompound query.  
fe90: 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20  (Only generated 
fea0: 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a  for UNION and.**
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49               UNI
fec0: 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20  ON ALL.  EXCEPT 
fed0: 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e  and INSERTSECT n
fee0: 65 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f  ever output a ro
fef0: 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  w that.**       
ff00: 20 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e        appears on
ff10: 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20  ly in B.).**.** 
ff20: 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c     AltB:    Call
ff30: 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
ff40: 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
ff50: 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
ff60: 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71  <B..**.**    Aeq
ff70: 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
ff80: 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
ff90: 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
ffa0: 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a  ines and A==B..*
ffb0: 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20  *.**    AgtB:   
ffc0: 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
ffd0: 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
ffe0: 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
fff0: 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A>B..**.**  
10000 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65    EofA:    Calle
10010 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
10020 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
10030 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lectA..**.**    
10040 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  EofB:    Called 
10050 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68  when data is exh
10060 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65  austed from sele
10070 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ctB..**.** The i
10080 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
10090 20 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65   the latter five
100a0 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70   subroutines dep
100b0 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a  end on which .**
100c0 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75   <operator> is u
100d0 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20  sed:.**.**.**   
100e0 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
100f0 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f  ALL         UNIO
10100 4e 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43  N            EXC
10110 45 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54  EPT          INT
10120 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  ERSECT.**       
10130 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
10140 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
10150 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
10160 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
10170 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42  ------.**   AltB
10180 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
10190 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
101a0 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
101b0 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41  tA         nextA
101c0 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20  .**.**   AeqB:  
101d0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
101e0 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20       nextA      
101f0 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
10200 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
10210 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20  .**.**   AgtB:  
10220 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
10230 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
10240 20 20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20         nextB    
10250 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a          nextB.**
10260 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75  .**   EofA:   ou
10270 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
10280 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
10290 20 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20      halt        
102a0 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20       halt.**.** 
102b0 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20    EofB:   outA, 
102c0 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c  nextA      outA,
102d0 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74   nextA       out
102e0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
102f0 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74   halt.**.** In t
10300 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61  he AltB, AeqB, a
10310 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69  nd AgtB subrouti
10320 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41  nes, an EOF on A
10330 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41   following nextA
10340 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d  .** causes an im
10350 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
10360 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20  EofA and an EOF 
10370 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  on B following n
10380 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61  extB causes.** a
10390 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70  n immediate jump
103a0 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69   to EofB.  Withi
103b0 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c  n EofA and EofB,
103c0 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72   and EOF on entr
103d0 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  y or.** followin
103e0 67 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61  g nextX causes a
103f0 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   jump to the end
10400 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70   of the select p
10410 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
10420 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76   Duplicate remov
10430 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c  al in the UNION,
10440 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54   EXCEPT, and INT
10450 45 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20  ERSECT cases is 
10460 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69  handled.** withi
10470 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62  n the output sub
10480 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65  routine.  The re
10490 67 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73  gPrev register s
104a0 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65  et holds the pre
104b0 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75  viously.** outpu
104c0 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70  t value.  A comp
104d0 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61  arison is made a
104e0 67 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75  gainst this valu
104f0 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  e and the output
10500 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69  .** is skipped i
10510 66 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c  f the next resul
10520 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20  ts would be the 
10530 73 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76  same as the prev
10540 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ious..**.** The 
10550 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70  implementation p
10560 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d  lan is to implem
10570 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f  ent the two coro
10580 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e  utines and seven
10590 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20  .** subroutines 
105a0 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20  first, then put 
105b0 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69  the control logi
105c0 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e  c at the bottom.
105d0 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a    Like this:.**.
105e0 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  **          goto
105f0 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41   Init.**     coA
10600 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  : coroutine for 
10610 6c 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a  left query (A).*
10620 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75  *     coB: corou
10630 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71  tine for right q
10640 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f  uery (B).**    o
10650 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20  utA: output one 
10660 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f  row of A.**    o
10670 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20  utB: output one 
10680 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20  row of B (UNION 
10690 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e  and UNION ALL on
106a0 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20  ly).**    EofA: 
106b0 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20  ....**    EofB: 
106c0 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20  ....**    AltB: 
106d0 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  ....**    AeqB: 
106e0 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  ....**    AgtB: 
106f0 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20  ....**    Init: 
10700 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75  initialize corou
10710 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a  tine registers.*
10720 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64  *          yield
10730 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20   coA.**         
10740 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20   if eof(A) goto 
10750 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  EofA.**         
10760 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20   yield coB.**   
10770 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29         if eof(B)
10780 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20   goto EofB.**   
10790 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41   Cmpr: Compare A
107a0 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  , B.**          
107b0 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c  Jump AltB, AeqB,
107c0 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64   AgtB.**     End
107d0 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63  : ....**.** We c
107e0 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  all AltB, AeqB, 
107f0 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20  AgtB, EofA, and 
10800 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65  EofB "subroutine
10810 73 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20  s" but they are 
10820 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20  not.** actually 
10830 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73  called using Gos
10840 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e  ub and they do n
10850 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41  ot Return.  EofA
10860 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a   and EofB loop.*
10870 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61  * until all data
10880 20 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68   is exhausted th
10890 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22  en jump to the "
108a0 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42  end" labe.  AltB
108b0 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41  , AeqB,.** and A
108c0 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68  gtB jump to eith
108d0 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20  er L2 or to one 
108e0 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e  of EofA or EofB.
108f0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
10900 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
10910 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69  _SELECT.static i
10920 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
10930 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
10940 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
10950 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
10960 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
10970 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
10980 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
10990 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
109a0 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
109b0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
109c0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
109d0 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
109e0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  s */.){.  int i,
109f0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
10a00 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
10a10 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
10a20 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
10a30 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
10a40 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
10a50 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
10a60 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
10a70 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
10a80 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
10a90 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
10aa0 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73  estA;     /* Des
10ab0 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72  tination for cor
10ac0 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65  outine A */.  Se
10ad0 6c 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20  lectDest destB; 
10ae0 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
10af0 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
10b00 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41   B */.  int regA
10b10 64 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrA;         /*
10b20 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
10b30 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63  r for select-A c
10b40 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
10b50 74 20 72 65 67 45 6f 66 41 3b 20 20 20 20 20 20  t regEofA;      
10b60 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69      /* Flag to i
10b70 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c  ndicate when sel
10b80 65 63 74 2d 41 20 69 73 20 63 6f 6d 70 6c 65 74  ect-A is complet
10b90 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  e */.  int regAd
10ba0 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drB;         /* 
10bb0 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
10bc0 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f   for select-B co
10bd0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
10be0 20 72 65 67 45 6f 66 42 3b 20 20 20 20 20 20 20   regEofB;       
10bf0 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e     /* Flag to in
10c00 64 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65  dicate when sele
10c10 63 74 2d 42 20 69 73 20 63 6f 6d 70 6c 65 74 65  ct-B is complete
10c20 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
10c30 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41  lectA;      /* A
10c40 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
10c50 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
10c60 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
10c70 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41  lectB;      /* A
10c80 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
10c90 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
10ca0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
10cb0 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  A;          /* A
10cc0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
10cd0 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41  for the output-A
10ce0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
10cf0 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20   int regOutB;   
10d00 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
10d10 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
10d20 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
10d30 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10d40 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20  addrOutA;       
10d50 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
10d60 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
10d70 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
10d80 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20   addrOutB = 0;  
10d90 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
10da0 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
10db0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
10dc0 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20  t addrEofA;     
10dd0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
10de0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65  f the select-A-e
10df0 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
10e00 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
10e10 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f  rEofB;         /
10e20 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
10e30 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73   select-B-exhaus
10e40 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
10e50 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42  /.  int addrAltB
10e60 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
10e70 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20  ress of the A<B 
10e80 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
10e90 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20 20  int addrAeqB;   
10ea0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
10eb0 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62   of the A==B sub
10ec0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
10ed0 20 61 64 64 72 41 67 74 42 3b 20 20 20 20 20 20   addrAgtB;      
10ee0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
10ef0 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74   the A>B subrout
10f00 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
10f10 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f  LimitA;        /
10f20 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72  * Limit register
10f30 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f   for select-A */
10f40 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42  .  int regLimitB
10f50 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
10f60 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
10f70 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
10f80 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20   regPrev;       
10f90 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66     /* A range of
10fa0 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f   registers to ho
10fb0 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  ld previous outp
10fc0 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65  ut */.  int save
10fd0 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a  dLimit;       /*
10fe0 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20   Saved value of 
10ff0 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69  p->iLimit */.  i
11000 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20  nt savedOffset; 
11010 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
11020 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65  lue of p->iOffse
11030 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  t */.  int label
11040 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  Cmpr;        /* 
11050 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74  Label for the st
11060 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65  art of the merge
11070 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20   algorithm */.  
11080 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20  int labelEnd;   
11090 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66        /* Label f
110a0 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  or the end of th
110b0 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54  e overall SELECT
110c0 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a   stmt */.  int j
110d0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
110e0 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63   /* Jump instruc
110f0 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72  tions that get r
11100 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20  etargetted */.  
11110 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
11120 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
11130 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e  TK_ALL, TK_UNION
11140 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f  , TK_EXCEPT, TK_
11150 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b  INTERSECT */.  K
11160 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20  eyInfo *pKeyDup 
11170 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73  = 0; /* Comparis
11180 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  on information f
11190 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d  or duplicate rem
111a0 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  oval */.  KeyInf
111b0 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20  o *pKeyMerge;   
111c0 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  /* Comparison in
111d0 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65  formation for me
111e0 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20  rging rows */.  
111f0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
11200 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
11210 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
11220 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
11230 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f  erBy;   /* The O
11240 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
11250 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  /.  int nOrderBy
11260 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
11270 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
11280 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
11290 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50  use */.  int *aP
112a0 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f  ermute;        /
112b0 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f  * Mapping from O
112c0 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f  RDER BY terms to
112d0 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75   result set colu
112e0 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  mns */..  assert
112f0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30  ( p->pOrderBy!=0
11300 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
11310 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22  eyDup==0 ); /* "
11320 4d 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65  Managed" code ne
11330 65 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65  eds this.  Ticke
11340 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62  t #3382. */.  db
11350 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
11360 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
11370 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  be;.  if( v==0 )
11380 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
11390 4f 4d 45 4d 3b 0a 20 20 6c 61 62 65 6c 45 6e 64  OMEM;.  labelEnd
113a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
113b0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61  keLabel(v);.  la
113c0 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65  belCmpr = sqlite
113d0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
113e0 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20  );...  /* Patch 
113f0 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  up the ORDER BY 
11400 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70  clause.  */.  op
11410 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50   = p->op;  .  pP
11420 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
11430 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
11440 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  or->pOrderBy==0 
11450 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
11460 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61  p->pOrderBy;.  a
11470 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20  ssert( pOrderBy 
11480 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  );.  nOrderBy = 
11490 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
114a0 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61  ..  /* For opera
114b0 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20  tors other than 
114c0 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76  UNION ALL we hav
114d0 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
114e0 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44  hat.  ** the ORD
114f0 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76  ER BY clause cov
11500 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f  ers every term o
11510 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
11520 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d  .  Add.  ** term
11530 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  s to the ORDER B
11540 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65  Y clause as nece
11550 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ssary..  */.  if
11560 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op!=TK_ALL ){.
11570 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d      for(i=1; db-
11580 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
11590 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74   && i<=p->pEList
115a0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
115b0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
115c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
115d0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  ;.      for(j=0,
115e0 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
115f0 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; j<nOrderBy; 
11600 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
11610 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
11620 49 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20 29 3b 0a  Item->iCol>0 );.
11630 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
11640 6d 2d 3e 69 43 6f 6c 3d 3d 69 20 29 20 62 72 65  m->iCol==i ) bre
11650 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
11660 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42    if( j==nOrderB
11670 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  y ){.        Exp
11680 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
11690 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
116a0 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c  K_INTEGER, 0, 0,
116b0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
116c0 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
116d0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
116e0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
116f0 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
11700 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
11710 2d 3e 69 54 61 62 6c 65 20 3d 20 69 3b 0a 20 20  ->iTable = i;.  
11720 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
11730 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
11740 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
11750 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 2c 20 30  OrderBy, pNew, 0
11760 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  );.        pOrde
11770 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b  rBy->a[nOrderBy+
11780 2b 5d 2e 69 43 6f 6c 20 3d 20 28 75 31 36 29 69  +].iCol = (u16)i
11790 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
117a0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
117b0 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
117c0 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64   permutation and
117d0 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69 73   keyinfo that is
117e0 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a 20   used with.  ** 
117f0 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  the permutation 
11800 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70  in order to comp
11810 61 72 69 73 6f 6e 73 20 74 6f 20 64 65 74 65 72  arisons to deter
11820 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74  mine if the next
11830 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73  .  ** row of res
11840 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ults comes from 
11850 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63  selectA or selec
11860 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78  tB.  Also add ex
11870 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c  plicit.  ** coll
11880 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52  ations to the OR
11890 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
118a0 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e  rms so that when
118b0 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
118c0 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68    ** to the righ
118d0 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61  t and the left a
118e0 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68  re evaluated, th
118f0 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65  ey use the corre
11900 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  ct.  ** collatio
11910 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75  n..  */.  aPermu
11920 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  te = sqlite3DbMa
11930 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
11940 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79  of(int)*nOrderBy
11950 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74  );.  if( aPermut
11960 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  e ){.    struct 
11970 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
11980 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Item;.    for(i=
11990 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
119a0 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79  y->a; i<nOrderBy
119b0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
119c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
119d0 49 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20 20 26 26  Item->iCol>0  &&
119e0 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3c 3d 70 2d   pItem->iCol<=p-
119f0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
11a00 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65  ;.      aPermute
11a10 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 69 43 6f  [i] = pItem->iCo
11a20 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  l - 1;.    }.   
11a30 20 70 4b 65 79 4d 65 72 67 65 20 3d 0a 20 20 20   pKeyMerge =.   
11a40 20 20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c     sqlite3DbMall
11a50 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
11a60 28 2a 70 4b 65 79 4d 65 72 67 65 29 2b 6e 4f 72  (*pKeyMerge)+nOr
11a70 64 65 72 42 79 2a 28 73 69 7a 65 6f 66 28 43 6f  derBy*(sizeof(Co
11a80 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 20  llSeq*)+1));.   
11a90 20 69 66 28 20 70 4b 65 79 4d 65 72 67 65 20 29   if( pKeyMerge )
11aa0 7b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67  {.      pKeyMerg
11ab0 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  e->aSortOrder = 
11ac0 28 75 38 2a 29 26 70 4b 65 79 4d 65 72 67 65 2d  (u8*)&pKeyMerge-
11ad0 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 5d  >aColl[nOrderBy]
11ae0 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67  ;.      pKeyMerg
11af0 65 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36  e->nField = (u16
11b00 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  )nOrderBy;.     
11b10 20 70 4b 65 79 4d 65 72 67 65 2d 3e 65 6e 63 20   pKeyMerge->enc 
11b20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20  = ENC(db);.     
11b30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
11b40 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
11b50 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
11b60 6c 6c 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72  ll;.        Expr
11b70 20 2a 70 54 65 72 6d 20 3d 20 70 4f 72 64 65 72   *pTerm = pOrder
11b80 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
11b90 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
11ba0 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  m->flags & EP_Ex
11bb0 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  pCollate ){.    
11bc0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 54        pColl = pT
11bd0 65 72 6d 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20  erm->pColl;.    
11be0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11bf0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c       pColl = mul
11c00 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
11c10 70 50 61 72 73 65 2c 20 70 2c 20 61 50 65 72 6d  pParse, p, aPerm
11c20 75 74 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ute[i]);.       
11c30 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20     pTerm->flags 
11c40 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65  |= EP_ExpCollate
11c50 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72  ;.          pTer
11c60 6d 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c  m->pColl = pColl
11c70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11c80 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61      pKeyMerge->a
11c90 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b  Coll[i] = pColl;
11ca0 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72  .        pKeyMer
11cb0 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ge->aSortOrder[i
11cc0 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ] = pOrderBy->a[
11cd0 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
11ce0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
11cf0 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72  lse{.    pKeyMer
11d00 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ge = 0;.  }..  /
11d10 2a 20 52 65 61 74 74 61 63 68 20 74 68 65 20 4f  * Reattach the O
11d20 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
11d30 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  o the query..  *
11d40 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  /.  p->pOrderBy 
11d50 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50  = pOrderBy;.  pP
11d60 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d  rior->pOrderBy =
11d70 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
11d80 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
11d90 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20  pOrderBy, 0);.. 
11da0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72   /* Allocate a r
11db0 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72  ange of temporar
11dc0 79 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  y registers and 
11dd0 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64  the KeyInfo need
11de0 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  ed.  ** for the 
11df0 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76  logic that remov
11e00 65 73 20 64 75 70 6c 69 63 61 74 65 20 72 65 73  es duplicate res
11e10 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68  ult rows when th
11e20 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20  e.  ** operator 
11e30 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  is UNION, EXCEPT
11e40 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28  , or INTERSECT (
11e50 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c  but not UNION AL
11e60 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  L)..  */.  if( o
11e70 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
11e80 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20   regPrev = 0;.  
11e90 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
11ea0 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
11eb0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->nExpr;.    ass
11ec0 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e  ert( nOrderBy>=n
11ed0 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  Expr || db->mall
11ee0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
11ef0 72 65 67 50 72 65 76 20 3d 20 73 71 6c 69 74 65  regPrev = sqlite
11f00 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
11f10 61 72 73 65 2c 20 6e 45 78 70 72 2b 31 29 3b 0a  arse, nExpr+1);.
11f20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11f30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
11f40 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29  ger, 0, regPrev)
11f50 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20  ;.    pKeyDup = 
11f60 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
11f70 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20  ero(db,.        
11f80 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
11f90 28 2a 70 4b 65 79 44 75 70 29 20 2b 20 6e 45 78  (*pKeyDup) + nEx
11fa0 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  pr*(sizeof(CollS
11fb0 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 20 20 69  eq*)+1) );.    i
11fc0 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20  f( pKeyDup ){.  
11fd0 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f      pKeyDup->aSo
11fe0 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
11ff0 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 6e  pKeyDup->aColl[n
12000 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 70 4b 65  Expr];.      pKe
12010 79 44 75 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28  yDup->nField = (
12020 75 31 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 20  u16)nExpr;.     
12030 20 70 4b 65 79 44 75 70 2d 3e 65 6e 63 20 3d 20   pKeyDup->enc = 
12040 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66  ENC(db);.      f
12050 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
12060 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
12070 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d  KeyDup->aColl[i]
12080 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
12090 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
120a0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65   i);.        pKe
120b0 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  yDup->aSortOrder
120c0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
120d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f  .    }.  }. .  /
120e0 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20 6c  * Separate the l
120f0 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67 68  eft and the righ
12100 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65  t query from one
12110 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20   another.  */.  
12120 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
12130 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d   pPrior->pRightm
12140 6f 73 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ost = 0;.  sqlit
12150 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
12160 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c  oupBy(pParse, p,
12170 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
12180 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50  RDER");.  if( pP
12190 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  rior->pPrior==0 
121a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
121b0 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
121c0 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  y(pParse, pPrior
121d0 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  , pPrior->pOrder
121e0 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
121f0 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
12200 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
12210 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ers */.  compute
12220 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
12230 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45  Parse, p, labelE
12240 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
12250 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41  imit && op==TK_A
12260 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d  LL ){.    regLim
12270 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itA = ++pParse->
12280 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d  nMem;.    regLim
12290 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itB = ++pParse->
122a0 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
122b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
122c0 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73  P_Copy, p->iOffs
122d0 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b  et ? p->iOffset+
122e0 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20  1 : p->iLimit,. 
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12310 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20   regLimitA);.   
12320 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12330 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
12340 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d  egLimitA, regLim
12350 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  itB);.  }else{. 
12360 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72     regLimitA = r
12370 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20  egLimitB = 0;.  
12380 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
12390 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
123a0 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  mit);.  p->pLimi
123b0 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
123c0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
123d0 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d  ->pOffset);.  p-
123e0 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >pOffset = 0;.. 
123f0 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50   regAddrA = ++pP
12400 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
12410 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73 65  gEofA = ++pParse
12420 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64  ->nMem;.  regAdd
12430 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rB = ++pParse->n
12440 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20 3d  Mem;.  regEofB =
12450 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
12460 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70  .  regOutA = ++p
12470 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
12480 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73  egOutB = ++pPars
12490 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
124a0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
124b0 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72  (&destA, SRT_Cor
124c0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
124d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
124e0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
124f0 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  B, SRT_Coroutine
12500 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20  , regAddrB);..  
12510 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74 68 65  /* Jump past the
12520 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f 75 74   various subrout
12530 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75 74 69  ines and corouti
12540 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a  nes to the main.
12550 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70 0a    ** merge loop.
12560 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c 69    */.  j1 = sqli
12570 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
12580 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64 64   OP_Goto);.  add
12590 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74  rSelectA = sqlit
125a0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
125b0 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e  r(v);...  /* Gen
125c0 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
125d0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
125e0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
125f0 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  nt to the.  ** l
12600 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  eft of the compo
12610 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74  und operator - t
12620 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20  he "A" select.. 
12630 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
12640 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
12650 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
12660 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  eft SELECT"));. 
12670 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
12680 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 73  = regLimitA;.  s
12690 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
126a0 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
126b0 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  stA);.  sqlite3V
126c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
126d0 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45  Integer, 1, regE
126e0 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
126f0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
12700 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
12710 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ;.  VdbeNoopComm
12720 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72  ent((v, "End cor
12730 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20  outine for left 
12740 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a  SELECT"));..  /*
12750 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f   Generate a coro
12760 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74  utine to evaluat
12770 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
12780 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20  tement on .  ** 
12790 74 68 65 20 72 69 67 68 74 20 2d 20 74 68 65 20  the right - the 
127a0 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a  "B" select.  */.
127b0 20 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20    addrSelectB = 
127c0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
127d0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 56 64 62  ntAddr(v);.  Vdb
127e0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
127f0 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e   "Begin coroutin
12800 65 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45  e for right SELE
12810 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69  CT"));.  savedLi
12820 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
12830 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d  .  savedOffset =
12840 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70   p->iOffset;.  p
12850 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69  ->iLimit = regLi
12860 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  mitB;.  p->iOffs
12870 65 74 20 3d 20 30 3b 20 20 0a 20 20 73 71 6c 69  et = 0;  .  sqli
12880 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
12890 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20  , p, &destB);.  
128a0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65  p->iLimit = save
128b0 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66  dLimit;.  p->iOf
128c0 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73  fset = savedOffs
128d0 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  et;.  sqlite3Vdb
128e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
128f0 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66  teger, 1, regEof
12900 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  B);.  sqlite3Vdb
12910 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
12920 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  eld, regAddrB);.
12930 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
12940 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75  t((v, "End corou
12950 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53  tine for right S
12960 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20  ELECT"));..  /* 
12970 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
12980 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
12990 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
129a0 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a  ow of the A.  **
129b0 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
129c0 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
129d0 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
129e0 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64  elect..  */.  Vd
129f0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
12a00 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
12a10 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64  e for A"));.  ad
12a20 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74  drOutA = generat
12a30 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
12a40 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
12a50 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
12a60 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67  estA, pDest, reg
12a70 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20  OutA,.          
12a80 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
12a90 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49  pKeyDup, P4_KEYI
12aa0 4e 46 4f 5f 48 41 4e 44 4f 46 46 2c 20 6c 61 62  NFO_HANDOFF, lab
12ab0 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20  elEnd);.  .  /* 
12ac0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
12ad0 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
12ae0 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
12af0 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a  ow of the B.  **
12b00 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
12b10 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
12b20 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
12b30 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elect..  */.  if
12b40 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
12b50 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
12b60 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
12b70 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
12b80 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29  routine for B"))
12b90 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d  ;.    addrOutB =
12ba0 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
12bb0 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
12bc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12bd0 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44     p, &destB, pD
12be0 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20  est, regOutB,.  
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
12c00 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
12c10 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54   P4_KEYINFO_STAT
12c20 49 43 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  IC, labelEnd);. 
12c30 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
12c40 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
12c50 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
12c60 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
12c70 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct A.  ** are ex
12c80 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
12c90 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
12ca0 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  B remains..  */.
12cb0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
12cc0 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62  t((v, "eof-A sub
12cd0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 69 66  routine"));.  if
12ce0 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ( op==TK_EXCEPT 
12cf0 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  || op==TK_INTERS
12d00 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45  ECT ){.    addrE
12d10 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofA = sqlite3Vdb
12d20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
12d30 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 45 6e 64 29  to, 0, labelEnd)
12d40 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
12d50 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69   addrEofA = sqli
12d60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12d70 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c   OP_If, regEofB,
12d80 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20   labelEnd);.    
12d90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12da0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
12db0 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
12dc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12dd0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
12de0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b  ield, regAddrB);
12df0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12e00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
12e10 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b  o, 0, addrEofA);
12e20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
12e30 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
12e40 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
12e50 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
12e60 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20  lect B.  ** are 
12e70 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
12e80 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
12e90 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t A remains..  *
12ea0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  /.  if( op==TK_I
12eb0 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
12ec0 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45  addrEofB = addrE
12ed0 6f 66 41 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  ofA;.  }else{  .
12ee0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
12ef0 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73  ent((v, "eof-B s
12f00 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
12f10 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c    addrEofB = sql
12f20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12f30 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
12f40 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20  , labelEnd);.   
12f50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12f60 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
12f70 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
12f80 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
12f90 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
12fa0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
12fb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12fc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
12fd0 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29  to, 0, addrEofB)
12fe0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
12ff0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
13000 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
13010 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A<B.  */.  VdbeN
13020 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
13030 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-lt-B subroutin
13040 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42  e"));.  addrAltB
13050 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
13060 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
13070 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
13080 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  utA);.  sqlite3V
13090 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
130a0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
130b0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
130c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
130d0 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66  regEofA, addrEof
130e0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
130f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
13100 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
13110 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
13120 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
13130 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d   the case of A==
13140 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  B.  */.  if( op=
13150 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61  =TK_ALL ){.    a
13160 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
13170 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  tB;.  }else if( 
13180 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
13190 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
131a0 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20   = addrAltB;.   
131b0 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d   addrAltB++;.  }
131c0 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f  else{.    VdbeNo
131d0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
131e0 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -eq-B subroutine
131f0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71  "));.    addrAeq
13200 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56  B =.    sqlite3V
13210 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
13220 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
13230 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13240 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
13250 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45  , regEofA, addrE
13260 6f 66 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ofA);.    sqlite
13270 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13280 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
13290 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Cmpr);.  }..  /*
132a0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
132b0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
132c0 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20  e of A>B.  */.  
132d0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
132e0 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72  (v, "A-gt-B subr
132f0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
13300 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAgtB = sqlite3V
13310 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
13320 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
13330 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
13340 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ION ){.    sqlit
13350 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13360 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
13370 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
13380 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
13390 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
133a0 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20  d, regAddrB);.  
133b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
133c0 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
133d0 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  ofB, addrEofB);.
133e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
133f0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
13400 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  0, labelCmpr);..
13410 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72    /* This code r
13420 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74  uns once to init
13430 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e  ialize everythin
13440 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  g..  */.  sqlite
13450 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
13460 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   j1);.  sqlite3V
13470 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13480 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45  Integer, 0, regE
13490 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
134a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
134b0 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45  Integer, 0, regE
134c0 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofB);.  sqlite3V
134d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
134e0 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 41 2c  Gosub, regAddrA,
134f0 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20   addrSelectA);. 
13500 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13510 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
13520 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 53 65  regAddrB, addrSe
13530 6c 65 63 74 42 29 3b 0a 20 20 73 71 6c 69 74 65  lectB);.  sqlite
13540 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13550 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61  P_If, regEofA, a
13560 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  ddrEofA);.  sqli
13570 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13580 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c   OP_If, regEofB,
13590 20 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20 20 2f   addrEofB);..  /
135a0 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  * Implement the 
135b0 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a  main merge loop.
135c0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
135d0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
135e0 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
135f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13600 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74  4(v, OP_Permutat
13610 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  ion, 0, 0, 0, (c
13620 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50  har*)aPermute, P
13630 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73  4_INTARRAY);.  s
13640 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
13650 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
13660 64 65 73 74 41 2e 69 4d 65 6d 2c 20 64 65 73 74  destA.iMem, dest
13670 42 2e 69 4d 65 6d 2c 20 6e 4f 72 64 65 72 42 79  B.iMem, nOrderBy
13680 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13690 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
136a0 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f  *)pKeyMerge, P4_
136b0 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
136c0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
136d0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
136e0 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72  , addrAltB, addr
136f0 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b  AeqB, addrAgtB);
13700 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74  ..  /* Release t
13710 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
13720 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  rs.  */.  if( re
13730 67 50 72 65 76 20 29 7b 0a 20 20 20 20 73 71 6c  gPrev ){.    sql
13740 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
13750 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
13760 50 72 65 76 2c 20 6e 4f 72 64 65 72 42 79 2b 31  Prev, nOrderBy+1
13770 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  );.  }..  /* Jum
13780 70 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f  p to the this po
13790 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  int in order to 
137a0 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75  terminate the qu
137b0 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ery..  */.  sqli
137c0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
137d0 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29  bel(v, labelEnd)
137e0 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
137f0 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
13800 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20   columns.  */.  
13810 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
13820 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
13830 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
13840 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  st = pPrior;.   
13850 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
13860 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
13870 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
13880 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  ;.    generateCo
13890 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
138a0 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
138b0 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
138c0 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63  Reassembly the c
138d0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f  ompound query so
138e0 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
138f0 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79   freed correctly
13900 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  .  ** by the cal
13910 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ling function */
13920 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
13930 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
13940 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
13950 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a  p->pPrior);.  }.
13960 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
13970 72 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42  rior;..  /*** TB
13980 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f  D:  Insert subro
13990 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63  utine calls to c
139a0 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  lose cursors on 
139b0 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a  incomplete.  ***
139c0 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a  * subqueries ***
139d0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  */.  return SQLI
139e0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
139f0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
13a00 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
13a10 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
13a20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
13a30 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63  )./* Forward Dec
13a40 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  larations */.sta
13a50 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
13a60 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c  prList(sqlite3*,
13a70 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c   ExprList*, int,
13a80 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61   ExprList*);.sta
13a90 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
13aa0 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53  lect(sqlite3*, S
13ab0 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78  elect *, int, Ex
13ac0 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a  prList *);../*.*
13ad0 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
13ae0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
13af0 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76  xpr.  Replace ev
13b00 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
13b10 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  .** a column in 
13b20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61  table number iTa
13b30 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20  ble with a copy 
13b40 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  of the iColumn-t
13b50 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  h.** entry in pE
13b60 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
13b70 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
13b80 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
13b90 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
13ba0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
13bb0 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
13bc0 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
13bd0 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
13be0 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
13bf0 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
13c00 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
13c10 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
13c20 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
13c30 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
13c40 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
13c50 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
13c60 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
13c70 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
13c80 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
13c90 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74  s routine make t
13ca0 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
13cb0 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
13cc0 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
13cd0 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
13ce0 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
13cf0 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
13d00 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
13d10 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
13d20 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
13d30 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
13d40 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr(.  sqlite3 *
13d50 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65  db,        /* Re
13d60 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
13d70 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65  rs to this conne
13d80 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ction */.  Expr 
13d90 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f  *pExpr,        /
13da0 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20  * Expr in which 
13db0 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63  substitution occ
13dc0 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  urs */.  int iTa
13dd0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ble,         /* 
13de0 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73  Table to be subs
13df0 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70  tituted */.  Exp
13e00 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
13e10 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65   /* Substitute e
13e20 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b  xpressions */.){
13e30 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
13e40 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
13e50 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
13e60 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
13e70 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b  Table==iTable ){
13e80 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
13e90 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
13ea0 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
13eb0 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  K_NULL;.    }els
13ec0 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
13ed0 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72  New;.      asser
13ee0 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20  t( pEList!=0 && 
13ef0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
13f00 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
13f10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
13f20 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
13f30 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
13f40 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  0 );.      pNew 
13f50 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  = pEList->a[pExp
13f60 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
13f70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
13f80 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20   pNew!=0 );.    
13f90 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e    pExpr->op = pN
13fa0 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73  ew->op;.      as
13fb0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
13fc0 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ft==0 );.      p
13fd0 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71  Expr->pLeft = sq
13fe0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
13ff0 20 70 4e 65 77 2d 3e 70 4c 65 66 74 2c 20 30 29   pNew->pLeft, 0)
14000 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14010 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
14020 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
14030 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
14040 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e 65  3ExprDup(db, pNe
14050 77 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  w->pRight, 0);. 
14060 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
14070 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c  le = pNew->iTabl
14080 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  e;.      pExpr->
14090 70 54 61 62 20 3d 20 70 4e 65 77 2d 3e 70 54 61  pTab = pNew->pTa
140a0 62 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  b;.      pExpr->
140b0 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e  iColumn = pNew->
140c0 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
140d0 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65  Expr->iAgg = pNe
140e0 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73  w->iAgg;.      s
140f0 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
14100 64 62 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65  db, &pExpr->toke
14110 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29  n, &pNew->token)
14120 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
14130 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 45  okenCopy(db, &pE
14140 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77  xpr->span, &pNew
14150 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 61  ->span);.      a
14160 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e  ssert( pExpr->x.
14170 70 4c 69 73 74 3d 3d 30 20 26 26 20 70 45 78 70  pList==0 && pExp
14180 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30 20  r->x.pSelect==0 
14190 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  );.      if( Exp
141a0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
141b0 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  w, EP_xIsSelect)
141c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
141d0 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73  r->x.pSelect = s
141e0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
141f0 64 62 2c 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c  db, pNew->x.pSel
14200 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ect, 0);.      }
14210 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 45  else{.        pE
14220 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73  xpr->x.pList = s
14230 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
14240 70 28 64 62 2c 20 70 4e 65 77 2d 3e 78 2e 70 4c  p(db, pNew->x.pL
14250 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ist, 0);.      }
14260 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c  .      pExpr->fl
14270 61 67 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67  ags = pNew->flag
14280 73 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  s;.      pExpr->
14290 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 65 77 2d  pAggInfo = pNew-
142a0 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20  >pAggInfo;.     
142b0 20 70 4e 65 77 2d 3e 70 41 67 67 49 6e 66 6f 20   pNew->pAggInfo 
142c0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
142d0 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  se{.    substExp
142e0 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  r(db, pExpr->pLe
142f0 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ft, iTable, pELi
14300 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
14310 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52  pr(db, pExpr->pR
14320 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  ight, iTable, pE
14330 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45  List);.    if( E
14340 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
14350 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
14360 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62  ct) ){.      sub
14370 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78  stSelect(db, pEx
14380 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69  pr->x.pSelect, i
14390 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
143a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
143b0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
143c0 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  b, pExpr->x.pLis
143d0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
143e0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
143f0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
14400 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c  tExprList(.  sql
14410 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
14420 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
14430 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
14440 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
14450 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist,     /* List
14460 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20   to scan and in 
14470 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
14480 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69  bstitutes */.  i
14490 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
144a0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
144b0 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a  be substituted *
144c0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
144d0 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73  List     /* Subs
144e0 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f  titute values */
144f0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
14500 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
14510 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
14520 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
14530 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74   i++){.    subst
14540 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Expr(db, pList->
14550 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
14560 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
14570 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
14580 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71  ubstSelect(.  sq
14590 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
145a0 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c     /* Report mal
145b0 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20  loc errors here 
145c0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
145d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
145e0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
145f0 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73   which to make s
14600 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a  ubstitutions */.
14610 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
14620 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
14630 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a  to be replaced *
14640 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
14650 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73  List     /* Subs
14660 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f  titute values */
14670 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  .){.  SrcList *p
14680 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72  Src;.  struct Sr
14690 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
146a0 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
146b0 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !p ) return;. 
146c0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
146d0 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54  b, p->pEList, iT
146e0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
146f0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
14700 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  b, p->pGroupBy, 
14710 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
14720 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
14730 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
14740 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
14750 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 64  );.  substExpr(d
14760 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69  b, p->pHaving, i
14770 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
14780 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20    substExpr(db, 
14790 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c  p->pWhere, iTabl
147a0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
147b0 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d  bstSelect(db, p-
147c0 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c  >pPrior, iTable,
147d0 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63   pEList);.  pSrc
147e0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
147f0 73 65 72 74 28 20 70 53 72 63 20 29 3b 20 20 2f  sert( pSrc );  /
14800 2a 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c 45  * Even for (SELE
14810 43 54 20 31 29 20 77 65 20 68 61 76 65 3a 20 70  CT 1) we have: p
14820 53 72 63 21 3d 30 20 62 75 74 20 70 53 72 63 2d  Src!=0 but pSrc-
14830 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66  >nSrc==0 */.  if
14840 28 20 41 4c 57 41 59 53 28 70 53 72 63 29 20 29  ( ALWAYS(pSrc) )
14850 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63  {.    for(i=pSrc
14860 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53  ->nSrc, pItem=pS
14870 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  rc->a; i>0; i--,
14880 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
14890 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
148a0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c   pItem->pSelect,
148b0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
148c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
148d0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
148e0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
148f0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
14900 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
14910 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65  IEW) */..#if !de
14920 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14930 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
14940 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14950 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
14960 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
14970 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
14980 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f   subqueries in o
14990 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a  rder to speed.**
149a0 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20   execution.  It 
149b0 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
149c0 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
149d0 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
149e0 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a  ning.** occurs..
149f0 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
14a00 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
14a10 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
14a20 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
14a30 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
14a40 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
14a50 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
14a60 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
14a70 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
14a80 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
14a90 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
14aa0 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
14ab0 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
14ac0 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
14ad0 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
14ae0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
14af0 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
14b00 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
14b10 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
14b20 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
14b30 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
14b40 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
14b50 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
14b60 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
14b70 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
14b80 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
14b90 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
14ba0 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
14bb0 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
14bc0 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
14bd0 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
14be0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
14bf0 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
14c00 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
14c10 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
14c20 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
14c30 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
14c40 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
14c50 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
14c60 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
14c70 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
14c80 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
14c90 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
14ca0 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69  this simpificati
14cb0 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
14cc0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
14cd0 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
14ce0 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
14cf0 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
14d00 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
14d10 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
14d20 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
14d30 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
14d40 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
14d50 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
14d60 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
14d70 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
14d80 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
14d90 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
14da0 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
14db0 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
14dc0 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
14dd0 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
14de0 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
14df0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
14e00 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
14e10 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72  ate or the outer
14e20 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
14e30 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  join..**.**   (3
14e40 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
14e50 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
14e60 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
14e70 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a  ft outer join.**
14e80 20 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61          (Origina
14e90 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e  lly ticket #306.
14ea0 20 20 53 74 72 65 6e 67 68 74 65 6e 65 64 20 62    Strenghtened b
14eb0 79 20 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a  y ticket #3300).
14ec0 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65  **.**   (4)  The
14ed0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
14ee0 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65   DISTINCT or the
14ef0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
14f00 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
14f10 2a 20 20 20 28 35 29 20 20 54 68 65 20 73 75 62  *   (5)  The sub
14f20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53  query is not DIS
14f30 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74  TINCT or the out
14f40 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
14f50 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
14f60 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
14f70 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62  *   (6)  The sub
14f80 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
14f90 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
14fa0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
14fb0 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
14fc0 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a    DISTINCT..**.*
14fd0 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62  *   (7)  The sub
14fe0 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d  query has a FROM
14ff0 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
15000 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65   (8)  The subque
15010 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
15020 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
15030 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
15040 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
15050 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (9)  The subquer
15060 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
15070 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
15080 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
15090 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
150a0 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
150b0 20 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71    (10)  The subq
150c0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
150d0 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
150e0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
150f0 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
15100 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a     use LIMIT..**
15110 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
15120 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
15130 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
15140 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44  ot both have ORD
15150 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a  ER BY clauses..*
15160 2a 0a 2a 2a 20 20 28 31 32 29 20 20 4e 6f 74 20  *.**  (12)  Not 
15170 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75  implemented.  Su
15180 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74  bsumed into rest
15190 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61  riction (3).  Wa
151a0 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
151b0 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74         a separat
151c0 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65  e restriction de
151d0 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b  riving from tick
151e0 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20  et #350..**.**  
151f0 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65  (13)  The subque
15200 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65  ry and outer que
15210 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
15220 73 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20  se LIMIT.**.**  
15230 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65  (14)  The subque
15240 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
15250 4f 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20 20 28 31  OFFSET.**.**  (1
15260 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  5)  The outer qu
15270 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20  ery is not part 
15280 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
15290 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20  lect or the.**  
152a0 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64        subquery d
152b0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 62 6f 74  oes not have bot
152c0 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 61 6e  h an ORDER BY an
152d0 64 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  d a LIMIT clause
152e0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65  ..**        (See
152f0 20 74 69 63 6b 65 74 20 23 32 33 33 39 29 0a 2a   ticket #2339).*
15300 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20  *.**  (16)  The 
15310 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
15320 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
15330 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20  or the subquery 
15340 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e  does.**        n
15350 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  ot contain ORDER
15360 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32   BY.  (Ticket #2
15370 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20  942)  This used 
15380 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a  to not matter.**
15390 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65          until we
153a0 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20   introduced the 
153b0 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66  group_concat() f
153c0 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a  unction.  .**.**
153d0 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d    (17)  The sub-
153e0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63  query is not a c
153f0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
15400 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e  or it is a UNION
15410 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20   ALL .**        
15420 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20  compound clause 
15430 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79  made up entirely
15440 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74   of non-aggregat
15450 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a  e queries, and .
15460 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61  **        the pa
15470 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  rent query:.**.*
15480 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
15490 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20  not itself part 
154a0 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
154b0 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20  lect,.**        
154c0 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67    * is not an ag
154d0 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49  gregate or DISTI
154e0 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a  NCT query, and.*
154f0 2a 20 20 20 20 20 20 20 20 20 20 2a 20 68 61 73  *          * has
15500 20 6e 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 73   no other tables
15510 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 73 20   or sub-selects 
15520 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
15530 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  se..**.**       
15540 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20   The parent and 
15550 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f  sub-query may co
15560 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75  ntain WHERE clau
15570 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a  ses. Subject to.
15580 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20  **        rules 
15590 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28  (11), (13) and (
155a0 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c  14), they may al
155b0 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  so contain ORDER
155c0 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c   BY,.**        L
155d0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
155e0 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
155f0 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62  (18)  If the sub
15600 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
15610 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
15620 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
15630 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44  he.**        ORD
15640 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20  ER by clause of 
15650 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20  the parent must 
15660 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65  be simple refere
15670 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20  nces to .**     
15680 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68     columns of th
15690 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a  e sub-query..**.
156a0 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20 73 75  **  (19)  The su
156b0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
156c0 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
156d0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
156e0 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
156f0 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61  have a WHERE cla
15700 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  use..**.** In th
15710 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  is routine, the 
15720 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
15730 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
15740 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a  e outer query..*
15750 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69  * The subquery i
15760 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72  s p->pSrc->a[iFr
15770 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74  om].  isAgg is t
15780 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  rue if the outer
15790 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61   query.** uses a
157a0 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75  ggregates and su
157b0 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74  bqueryIsAgg is t
157c0 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
157d0 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
157e0 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c  tes..**.** If fl
157f0 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20  attening is not 
15800 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20  attempted, this 
15810 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
15820 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30  op and returns 0
15830 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  ..** If flatteni
15840 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20  ng is attempted 
15850 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
15860 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c  urns 1..**.** Al
15870 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  l of the express
15880 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73  ion analysis mus
15890 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20  t occur on both 
158a0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
158b0 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75  and.** the subqu
158c0 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20  ery before this 
158d0 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f  routine runs..*/
158e0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74  .static int flat
158f0 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50  tenSubquery(.  P
15900 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
15910 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
15920 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
15930 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
15940 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
15950 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73  r outer SELECT s
15960 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
15970 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
15980 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
15990 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74  ->pSrc->a[] of t
159a0 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72  he inner subquer
159b0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  y */.  int isAgg
159c0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
159d0 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c  rue if outer SEL
159e0 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61  ECT uses aggrega
159f0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
15a00 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73    int subqueryIs
15a10 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69  Agg    /* True i
15a20 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
15a30 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
15a40 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  nctions */.){.  
15a50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76  const char *zSav
15a60 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
15a70 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
15a80 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  text;.  Select *
15a90 70 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63  pParent;.  Selec
15aa0 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f  t *pSub;       /
15ab0 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  * The inner quer
15ac0 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20  y or "subquery" 
15ad0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
15ae0 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  b1;      /* Poin
15af0 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74  ter to the right
15b00 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73  most select in s
15b10 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  ub-query */.  Sr
15b20 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
15b30 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
15b40 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
15b50 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  r query */.  Src
15b60 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20  List *pSubSrc;  
15b70 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
15b80 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
15b90 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ery */.  ExprLis
15ba0 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  t *pList;    /* 
15bb0 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  The result set o
15bc0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
15bd0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  y */.  int iPare
15be0 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44  nt;        /* VD
15bf0 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
15c00 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73   of the pSub res
15c10 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62  ult set temp tab
15c20 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  le */.  int i;  
15c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
15c40 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
15c50 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
15c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c70 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
15c80 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
15c90 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
15ca0 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54  pSubitem;   /* T
15cb0 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
15cc0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
15cd0 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
15ce0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
15cf0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
15d00 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72  ermitted.  Retur
15d10 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f  n 0 if not..  */
15d20 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
15d30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
15d40 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a  pPrior==0 );  /*
15d50 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74   Unable to flatt
15d60 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  en compound quer
15d70 69 65 73 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20  ies */.  pSrc = 
15d80 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
15d90 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d  t( pSrc && iFrom
15da0 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72  >=0 && iFrom<pSr
15db0 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75  c->nSrc );.  pSu
15dc0 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  bitem = &pSrc->a
15dd0 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65  [iFrom];.  iPare
15de0 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
15df0 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d  Cursor;.  pSub =
15e00 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
15e10 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
15e20 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  ub!=0 );.  if( i
15e30 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79  sAgg && subquery
15e40 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
15e50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15e60 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
15e70 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73   (1)  */.  if( s
15e80 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20  ubqueryIsAgg && 
15e90 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72  pSrc->nSrc>1 ) r
15ea0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
15eb0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
15ec0 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53   (2)  */.  pSubS
15ed0 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
15ee0 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53  .  assert( pSubS
15ef0 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72  rc );.  /* Prior
15f00 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e   to version 3.1.
15f10 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  2, when LIMIT an
15f20 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20  d OFFSET had to 
15f30 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61  be simple consta
15f40 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72  nts,.  ** not ar
15f50 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 73  bitrary expresss
15f60 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
15f70 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
15f80 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
15f90 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
15fa0 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
15fb0 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
15fc0 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
15fd0 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
15fe0 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
15ff0 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
16000 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
16010 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
16020 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
16030 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
16040 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
16050 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
16060 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
16070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
16080 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
16090 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66  .  if( pSub->pOf
160a0 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b  fset ) return 0;
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
160d0 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
160e0 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74  .  if( p->pRight
160f0 6d 6f 73 74 20 26 26 20 70 53 75 62 2d 3e 70 4c  most && pSub->pL
16100 69 6d 69 74 20 26 26 20 70 53 75 62 2d 3e 70 4f  imit && pSub->pO
16110 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65  rderBy ){.    re
16120 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16150 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
16160 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (15) */.  }.  
16170 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
16180 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161a0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
161b0 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20  ction (7)  */.  
161c0 69 66 28 20 28 28 70 53 75 62 2d 3e 73 65 6c 46  if( ((pSub->selF
161d0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
161e0 63 74 29 21 3d 30 20 7c 7c 20 70 53 75 62 2d 3e  ct)!=0 || pSub->
161f0 70 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20  pLimit) .       
16200 20 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63    && (pSrc->nSrc
16210 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 20  >1 || isAgg) ){ 
16220 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
16230 72 69 63 74 69 6f 6e 73 20 28 34 29 28 35 29 28  rictions (4)(5)(
16240 38 29 28 39 29 20 2a 2f 0a 20 20 20 20 20 72 65  8)(9) */.     re
16250 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 0a 20  turn 0;       . 
16260 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c   }.  if( (p->sel
16270 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
16280 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75  nct)!=0 && subqu
16290 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
162a0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
162b0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
162c0 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20  n (6)  */.  }.  
162d0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
162e0 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
162f0 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  y ){.     return
16300 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
16310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16330 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31   Restriction (11
16340 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69  ) */.  }.  if( i
16350 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f  sAgg && pSub->pO
16360 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
16370 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
16380 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
16390 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70   (16) */.  if( p
163a0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
163b0 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
163c0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
163d0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
163e0 20 28 31 39 29 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   (19) */..  /* O
163f0 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20  BSOLETE COMMENT 
16400 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74  1:.  ** Restrict
16410 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73  ion 3:  If the s
16420 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69  ubquery is a joi
16430 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
16440 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20   subquery is .  
16450 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74  ** not used as t
16460 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
16470 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69   of an outer joi
16480 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  n.  Examples of 
16490 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73  why this.  ** is
164a0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
164b0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
164c0 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
164d0 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a  IN (t2 JOIN t3).
164e0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
164f0 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
16500 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
16510 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
16520 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
16530 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74   JOIN t2) JOIN t
16540 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63  3.  **.  ** whic
16550 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20  h is not at all 
16560 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a  the same thing..
16570 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45    **.  ** OBSOLE
16580 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20  TE COMMENT 2:.  
16590 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  ** Restriction 1
165a0 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  2:  If the subqu
165b0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
165c0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
165d0 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f  ft outer.  ** jo
165e0 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
165f0 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e  e subquery has n
16600 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  o WHERE clause..
16610 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73    ** An examples
16620 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20   of why this is 
16630 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
16640 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
16650 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
16660 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
16670 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30   t2 WHERE t2.x>0
16680 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
16690 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
166a0 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
166b0 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
166c0 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
166d0 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52  ER JOIN t2) WHER
166e0 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20  E t2.x>0.  **.  
166f0 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e  ** But the t2.x>
16700 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61  0 test will alwa
16710 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c  ys fail on a NUL
16720 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69  L row of t2, whi
16730 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76  ch.  ** effectiv
16740 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65  ely converts the
16750 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f   OUTER JOIN into
16760 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a   an INNER JOIN..
16770 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f    **.  ** THIS O
16780 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54  VERRIDES OBSOLET
16790 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44  E COMMENTS 1 AND
167a0 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54   2 ABOVE:.  ** T
167b0 69 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77  icket #3300 show
167c0 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e  s that flattenin
167d0 67 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  g the right term
167e0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a   of a LEFT JOIN.
167f0 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20    ** is fraught 
16800 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65  with danger.  Be
16810 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20  st to avoid the 
16820 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66  whole thing.  If
16830 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
16840 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
16850 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a  term of a LEFT J
16860 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  OIN, then do not
16870 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20   flatten..  */. 
16880 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e   if( (pSubitem->
16890 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
168a0 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  TER)!=0 ){.    r
168b0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
168c0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  /* Restriction 1
168d0 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  7: If the sub-qu
168e0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
168f0 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69  d SELECT, then i
16900 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20  t must.  ** use 
16910 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41  only the UNION A
16920 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64  LL operator. And
16930 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d   none of the sim
16940 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69  ple select queri
16950 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b  es.  ** that mak
16960 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e  e up the compoun
16970 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c  d SELECT are all
16980 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65  owed to be aggre
16990 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74  gate or distinct
169a0 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
169b0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
169c0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
169d0 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73  ( isAgg || (p->s
169e0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
169f0 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72  tinct)!=0 || pSr
16a00 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20  c->nSrc!=1 ){.  
16a10 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
16a20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62    }.    for(pSub
16a30 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70  1=pSub; pSub1; p
16a40 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69  Sub1=pSub1->pPri
16a50 6f 72 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  or){.      if( (
16a60 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
16a70 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
16a80 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30  F_Aggregate))!=0
16a90 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62  .       || (pSub
16aa0 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75  1->pPrior && pSu
16ab0 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  b1->op!=TK_ALL) 
16ac0 0a 20 20 20 20 20 20 20 7c 7c 20 21 70 53 75 62  .       || !pSub
16ad0 31 2d 3e 70 53 72 63 20 7c 7c 20 70 53 75 62 31  1->pSrc || pSub1
16ae0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 0a  ->pSrc->nSrc!=1.
16af0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
16b00 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
16b10 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
16b20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e   Restriction 18.
16b30 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
16b40 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
16b50 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66   int ii;.      f
16b60 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70  or(ii=0; ii<p->p
16b70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
16b80 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ii++){.        i
16b90 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  f( p->pOrderBy->
16ba0 61 5b 69 69 5d 2e 69 43 6f 6c 3d 3d 30 20 29 20  a[ii].iCol==0 ) 
16bb0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
16bc0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
16bd0 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63  ***** If we reac
16be0 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c  h this point, fl
16bf0 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
16c00 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20  itted. *****/.. 
16c10 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68   /* Authorize th
16c20 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
16c30 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
16c40 74 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  text = pSubitem-
16c50 3e 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  >zName;.  sqlite
16c60 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
16c70 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
16c80 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 70 50  , 0, 0, 0);.  pP
16c90 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
16ca0 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
16cb0 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66  ontext;..  /* If
16cc0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
16cd0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
16ce0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
16cf0 68 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74  hen (by restrict
16d00 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64  ions.  ** 17 and
16d10 20 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75   18 above) it mu
16d20 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c  st be a UNION AL
16d30 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74  L and the parent
16d40 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a   query must .  *
16d50 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  * be of the form
16d60 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
16d70 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73  SELECT <expr-lis
16d80 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75  t> FROM (<sub-qu
16d90 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61  ery>) <where-cla
16da0 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  use> .  **.  ** 
16db0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20  followed by any 
16dc0 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
16dd0 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c  and/or OFFSET cl
16de0 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63  auses. This bloc
16df0 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e  k.  ** creates N
16e00 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  -1 copies of the
16e10 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69   parent query wi
16e20 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20  thout any ORDER 
16e30 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20  BY, LIMIT or .  
16e40 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  ** OFFSET clause
16e50 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d  s and joins them
16e60 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e   to the left-han
16e70 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72  d-side of the or
16e80 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e  iginal.  ** usin
16e90 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  g UNION ALL oper
16ea0 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ators. In this c
16eb0 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ase N is the num
16ec0 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20  ber of simple.  
16ed0 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  ** select statem
16ee0 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70  ents in the comp
16ef0 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a  ound sub-query..
16f00 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c    **.  ** Exampl
16f10 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
16f20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d   SELECT a+1 FROM
16f30 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53   (.  **        S
16f40 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
16f50 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49  .  **        UNI
16f60 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
16f70 20 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d     SELECT y FROM
16f80 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
16f90 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
16fa0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62         SELECT ab
16fb0 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32  s(z*2) FROM tab2
16fc0 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52  .  **     ) WHER
16fd0 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20  E a!=5 ORDER BY 
16fe0 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e  1.  **.  ** Tran
16ff0 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20  sformed into:.  
17000 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
17010 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT x+1 FROM tab 
17020 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a  WHERE x+1!=5.  *
17030 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
17040 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
17050 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  y+1 FROM tab WHE
17060 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE y+1!=5.  **  
17070 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
17080 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73  *     SELECT abs
17090 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62  (z*2)+1 FROM tab
170a0 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29  2 WHERE abs(z*2)
170b0 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f  +1!=5.  **     O
170c0 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20  RDER BY 1.  **. 
170d0 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73   ** We call this
170e0 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73   the "compound-s
170f0 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
17100 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ng"..  */.  for(
17110 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
17120 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53  r; pSub; pSub=pS
17130 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
17140 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
17150 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
17160 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
17170 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  rBy;.    Expr *p
17180 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
17190 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
171a0 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
171b0 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  r;.    p->pOrder
171c0 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  By = 0;.    p->p
171d0 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Src = 0;.    p->
171e0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
171f0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
17200 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
17210 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
17220 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69  , 0);.    p->pLi
17230 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
17240 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
17250 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d  pOrderBy;.    p-
17260 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
17270 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c    p->op = TK_ALL
17280 3b 0a 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d  ;.    p->pRightm
17290 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ost = 0;.    if(
172a0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
172b0 20 20 70 4e 65 77 20 3d 20 70 50 72 69 6f 72 3b    pNew = pPrior;
172c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
172d0 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
172e0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
172f0 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  New->pRightmost 
17300 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
17310 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b  ->pPrior = pNew;
17320 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
17330 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
17340 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
17350 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67  Begin flattening
17360 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e   the iFrom-th en
17370 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
17380 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20  clause .  ** in 
17390 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
173a0 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70  .  */.  pSub = p
173b0 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d  Sub1 = pSubitem-
173c0 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20  >pSelect;..  /* 
173d0 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73  Delete the trans
173e0 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
173f0 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20  ture associated 
17400 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
17410 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71  bquery.  */.  sq
17420 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
17430 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
17440 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ase);.  sqlite3D
17450 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
17460 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  em->zName);.  sq
17470 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
17480 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
17490 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  );.  pSubitem->z
174a0 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
174b0 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pSubitem->zName 
174c0 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
174d0 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70  >zAlias = 0;.  p
174e0 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
174f0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65   = 0;..  /* Defe
17500 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54  r deleting the T
17510 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f  able object asso
17520 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
17530 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e    ** subquery un
17540 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74  til code generat
17550 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70  ion is.  ** comp
17560 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72  lete, since ther
17570 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73  e may still exis
17580 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72  t Expr.pTab entr
17590 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65  ies that.  ** re
175a0 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75  fer to the subqu
175b0 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66  ery even after f
175c0 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b  lattening.  Tick
175d0 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2f 0a 20  et #3346..  */. 
175e0 20 69 66 28 20 70 53 75 62 69 74 65 6d 2d 3e 70   if( pSubitem->p
175f0 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 54 61  Tab!=0 ){.    Ta
17600 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d  ble *pTabToDel =
17610 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b   pSubitem->pTab;
17620 0a 20 20 20 20 69 66 28 20 70 54 61 62 54 6f 44  .    if( pTabToD
17630 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20  el->nRef==1 ){. 
17640 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
17650 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 50  pNextZombie = pP
17660 61 72 73 65 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  arse->pZombieTab
17670 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
17680 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61  pZombieTab = pTa
17690 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73  bToDel;.    }els
176a0 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44  e{.      pTabToD
176b0 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  el->nRef--;.    
176c0 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e  }.    pSubitem->
176d0 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  pTab = 0;.  }.. 
176e0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
176f0 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65  g loop runs once
17700 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   for each term i
17710 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
17720 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74  query.  ** flatt
17730 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69  ening (as descri
17740 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20  bed above).  If 
17750 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64  we are doing a d
17760 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20  ifferent kind.  
17770 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** of flattening
17780 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20   - a flattening 
17790 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d  other than a com
177a0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
177b0 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a  lattening -.  **
177c0 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20   then this loop 
177d0 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a  only runs once..
177e0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
177f0 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66  oop moves all of
17800 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e   the FROM elemen
17810 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ts of the subque
17820 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ry into the.  **
17830 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
17840 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
17850 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69  ery.  Before doi
17860 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65  ng this, remembe
17870 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  r.  ** the curso
17880 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
17890 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20   original outer 
178a0 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65  query FROM eleme
178b0 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65  nt in.  ** iPare
178c0 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74  nt.  The iParent
178d0 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76   cursor will nev
178e0 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62  er be used.  Sub
178f0 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a  sequent code.  *
17900 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72  * will scan expr
17910 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20  essions looking 
17920 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65  for iParent refe
17930 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61  rences and repla
17940 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65  ce.  ** those re
17950 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78  ferences with ex
17960 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
17970 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75  esolve to the su
17980 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a  bquery FROM.  **
17990 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65   elements we are
179a0 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e   now copying in.
179b0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72  .  */.  for(pPar
179c0 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20  ent=p; pParent; 
179d0 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d  pParent=pParent-
179e0 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53  >pPrior, pSub=pS
179f0 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
17a00 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20   int nSubSrc;.  
17a10 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20    u8 jointype = 
17a20 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d  0;.    pSubSrc =
17a30 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20   pSub->pSrc;    
17a40 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
17a50 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  of subquery */. 
17a60 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75     nSubSrc = pSu
17a70 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20  bSrc->nSrc;  /* 
17a80 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
17a90 69 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  in subquery FROM
17aa0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70   clause */.    p
17ab0 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  Src = pParent->p
17ac0 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
17ad0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
17ae0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20  uter query */.. 
17af0 20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20     if( pSrc ){. 
17b00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
17b10 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46  rent==p );  /* F
17b20 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67  irst time throug
17b30 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
17b40 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70      jointype = p
17b50 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  Subitem->jointyp
17b60 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
17b70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
17b80 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e  ent!=p );  /* 2n
17b90 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
17ba0 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74   times through t
17bb0 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
17bc0 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
17bd0 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
17be0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
17bf0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
17c00 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a   if( pSrc==0 ){.
17c10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17c20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
17c30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
17c40 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
17c50 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62  ..    /* The sub
17c60 71 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e  query uses a sin
17c70 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20  gle slot of the 
17c80 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
17c90 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  he outer.    ** 
17ca0 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73  query.  If the s
17cb0 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65  ubquery has more
17cc0 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e   than one elemen
17cd0 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  t in its FROM cl
17ce0 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ause,.    ** the
17cf0 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  n expand the out
17d00 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65  er query to make
17d10 20 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f   space for it to
17d20 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e   hold all elemen
17d30 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ts.    ** of the
17d40 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
17d50 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65  *.    ** Example
17d60 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
17d70 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
17d80 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a   tabA, (SELECT *
17d90 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32   FROM sub1, sub2
17da0 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a  ), tabB;.    **.
17db0 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72      ** The outer
17dc0 20 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f   query has 3 slo
17dd0 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63  ts in its FROM c
17de0 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74  lause.  One slot
17df0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   of the.    ** o
17e00 75 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20  uter query (the 
17e10 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20  middle slot) is 
17e20 75 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71  used by the subq
17e30 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a  uery.  The next.
17e40 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20      ** block of 
17e50 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64  code will expand
17e60 20 74 68 65 20 6f 75 74 20 71 75 65 72 79 20 74   the out query t
17e70 6f 20 34 20 73 6c 6f 74 73 2e 20 20 54 68 65 20  o 4 slots.  The 
17e80 6d 69 64 64 6c 65 0a 20 20 20 20 2a 2a 20 73 6c  middle.    ** sl
17e90 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74  ot is expanded t
17ea0 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f  o two slots in o
17eb0 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61  rder to make spa
17ec0 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  ce for the.    *
17ed0 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  * two elements i
17ee0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
17ef0 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
17f00 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
17f10 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
17f20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53       pParent->pS
17f30 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69  rc = pSrc = sqli
17f40 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
17f50 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62  e(db, pSrc, nSub
17f60 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a  Src-1,iFrom+1);.
17f70 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
17f80 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
17f90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17fa0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
17fb0 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
17fc0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
17fd0 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75  s from the subqu
17fe0 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ery into the.   
17ff0 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e   ** outer query.
18000 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
18010 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
18020 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63  i++){.      pSrc
18030 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
18040 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
18050 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
18060 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
18070 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
18080 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
18090 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
180a0 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
180b0 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
180c0 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
180d0 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
180e0 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
180f0 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
18100 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
18110 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
18120 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
18130 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
18140 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
18150 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
18160 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
18170 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
18180 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
18190 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
181a0 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
181b0 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
181c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
181d0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
181e0 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
181f0 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
18200 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
18210 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
18220 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18230 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
18240 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
18250 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
18260 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
18270 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
18280 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
18290 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
182a0 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
182b0 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
182c0 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
182d0 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
182e0 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  */.    pList = p
182f0 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a  Parent->pEList;.
18300 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
18310 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
18320 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
18330 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
18340 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
18350 65 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20 3d  e==0 && (pExpr =
18360 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
18370 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29  pr)->span.z!=0 )
18380 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
18390 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 0a 20  >a[i].zName = . 
183a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
183b0 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
183c0 62 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d  b, (char*)pExpr-
183d0 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  >span.z, pExpr->
183e0 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d  span.n);.      }
183f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73 74  .    }.    subst
18400 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61  ExprList(db, pPa
18410 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50  rent->pEList, iP
18420 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
18430 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 69 73  ist);.    if( is
18440 41 67 67 20 29 7b 0a 20 20 20 20 20 20 73 75 62  Agg ){.      sub
18450 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
18460 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79  Parent->pGroupBy
18470 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
18480 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
18490 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50  substExpr(db, pP
184a0 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
184b0 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
184c0 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
184d0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64    if( pSub->pOrd
184e0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 61 73  erBy ){.      as
184f0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
18500 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
18510 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72      pParent->pOr
18520 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f  derBy = pSub->pO
18530 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53  rderBy;.      pS
18540 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
18550 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
18560 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
18570 79 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  y ){.      subst
18580 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61  ExprList(db, pPa
18590 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20  rent->pOrderBy, 
185a0 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
185b0 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
185c0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
185d0 72 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65  re ){.      pWhe
185e0 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
185f0 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57  Dup(db, pSub->pW
18600 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65  here, 0);.    }e
18610 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72  lse{.      pWher
18620 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 0;.    }.   
18630 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
18640 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  gg ){.      asse
18650 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  rt( pParent->pHa
18660 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ving==0 );.     
18670 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
18680 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  g = pParent->pWh
18690 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65  ere;.      pPare
186a0 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  nt->pWhere = pWh
186b0 65 72 65 3b 0a 20 20 20 20 20 20 73 75 62 73 74  ere;.      subst
186c0 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
186d0 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
186e0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
186f0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
18700 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
18710 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
18720 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c  Parent->pHaving,
18730 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
18740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18750 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
18760 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61  up(db, pSub->pHa
18770 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20  ving, 0));.     
18780 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
18790 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
187a0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
187b0 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
187c0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
187d0 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79  , pSub->pGroupBy
187e0 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
187f0 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
18800 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  (db, pParent->pW
18810 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70  here, iParent, p
18820 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
18830 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
18840 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
18850 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
18860 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
18870 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
18880 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64  /* The flattened
18890 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
188a0 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65  ct if either the
188b0 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20   inner or the.  
188c0 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
188d0 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20   is distinct. . 
188e0 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e     */.    pParen
188f0 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70  t->selFlags |= p
18900 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
18910 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a  SF_Distinct;.  .
18920 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45      /*.    ** SE
18930 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53  LECT ... FROM (S
18940 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20  ELECT ... LIMIT 
18950 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49  a OFFSET b) LIMI
18960 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20  T x OFFSET y;.  
18970 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20    **.    ** One 
18980 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72  is tempted to tr
18990 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62  y to add a and b
189a0 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20   to combine the 
189b0 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69  limits.  But thi
189c0 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  s.    ** does no
189d0 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72  t work if either
189e0 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69   limit is negati
189f0 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ve..    */.    i
18a00 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
18a10 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
18a20 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->pLimit = pSub-
18a30 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
18a40 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  Sub->pLimit = 0;
18a50 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
18a60 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74   Finially, delet
18a70 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f  e what is left o
18a80 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61  f the subquery a
18a90 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73  nd return.  ** s
18aa0 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  uccess..  */.  s
18ab0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
18ac0 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a  te(db, pSub1);..
18ad0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
18ae0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
18af0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
18b00 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
18b10 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
18b20 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  IEW) */../*.** A
18b30 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43  nalyze the SELEC
18b40 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  T statement pass
18b50 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
18b60 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a  t to see if it.*
18b70 2a 20 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20  * is a min() or 
18b80 6d 61 78 28 29 20 71 75 65 72 79 2e 20 52 65 74  max() query. Ret
18b90 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
18ba0 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f  Y_MIN or WHERE_O
18bb0 52 44 45 52 42 59 5f 4d 41 58 20 69 66 20 0a 2a  RDERBY_MAX if .*
18bc0 2a 20 69 74 20 69 73 2c 20 6f 72 20 30 20 6f 74  * it is, or 0 ot
18bd0 68 65 72 77 69 73 65 2e 20 41 74 20 70 72 65 73  herwise. At pres
18be0 65 6e 74 2c 20 61 20 71 75 65 72 79 20 69 73 20  ent, a query is 
18bf0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
18c00 0a 2a 2a 20 61 20 6d 69 6e 28 29 2f 6d 61 78 28  .** a min()/max(
18c10 29 20 71 75 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a  ) query if:.**.*
18c20 2a 20 20 20 31 2e 20 54 68 65 72 65 20 69 73 20  *   1. There is 
18c30 61 20 73 69 6e 67 6c 65 20 6f 62 6a 65 63 74 20  a single object 
18c40 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
18c50 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54  se..**.**   2. T
18c60 68 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65  here is a single
18c70 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
18c80 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61  he result set, a
18c90 6e 64 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  nd it is.**     
18ca0 20 65 69 74 68 65 72 20 6d 69 6e 28 78 29 20 6f   either min(x) o
18cb0 72 20 6d 61 78 28 78 29 2c 20 77 68 65 72 65 20  r max(x), where 
18cc0 78 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65  x is a column re
18cd0 66 65 72 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  ference..*/.stat
18ce0 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72  ic u8 minMaxQuer
18cf0 79 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  y(Select *p){.  
18d00 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45  Expr *pExpr;.  E
18d10 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
18d20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  = p->pEList;..  
18d30 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  if( pEList->nExp
18d40 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 57 48  r!=1 ) return WH
18d50 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
18d60 41 4c 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45  AL;.  pExpr = pE
18d70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
18d80 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
18d90 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
18da0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 20 72  P_xIsSelect) ) r
18db0 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73  eturn 0;.  pELis
18dc0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
18dd0 73 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  st;.  if( pExpr-
18de0 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
18df0 54 49 4f 4e 20 7c 7c 20 70 45 4c 69 73 74 3d 3d  TION || pEList==
18e00 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  0 || pEList->nEx
18e10 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
18e20 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  ;.  if( pEList->
18e30 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d  a[0].pExpr->op!=
18e40 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 20  TK_AGG_COLUMN ) 
18e50 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44  return WHERE_ORD
18e60 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69  ERBY_NORMAL;.  i
18e70 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  f( pExpr->token.
18e80 6e 21 3d 33 20 29 20 72 65 74 75 72 6e 20 57 48  n!=3 ) return WH
18e90 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
18ea0 41 4c 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  AL;.  if( sqlite
18eb0 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
18ec0 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
18ed0 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20  "min",3)==0 ){. 
18ee0 20 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f     return WHERE_
18ef0 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d  ORDERBY_MIN;.  }
18f00 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
18f10 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
18f20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
18f30 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  max",3)==0 ){.  
18f40 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f    return WHERE_O
18f50 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 7d 0a  RDERBY_MAX;.  }.
18f60 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f    return WHERE_O
18f70 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d  RDERBY_NORMAL;.}
18f80 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
18f90 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
18fa0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
18fb0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
18fc0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
18fd0 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
18fe0 72 67 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73  rgment is the as
18ff0 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61  sociated aggrega
19000 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20  te-info object. 
19010 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
19020 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53  n tests if the S
19030 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20  ELECT is of the 
19040 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  form:.**.**   SE
19050 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
19060 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77  OM <tbl>.**.** w
19070 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20  here table is a 
19080 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20  database table, 
19090 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74  not a sub-select
190a0 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65   or view. If the
190b0 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d   query.** does m
190c0 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72  atch this patter
190d0 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  n, then a pointe
190e0 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f  r to the Table o
190f0 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69  bject representi
19100 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72  ng.** <tbl> is r
19110 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
19120 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
19130 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62  d..*/.static Tab
19140 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e  le *isSimpleCoun
19150 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67  t(Select *p, Agg
19160 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
19170 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
19180 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a    Expr *pExpr;..
19190 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47    assert( !p->pG
191a0 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28  roupBy );..  if(
191b0 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d   p->pWhere || p-
191c0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
191d0 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63  1 .   || p->pSrc
191e0 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e  ->nSrc!=1 || p->
191f0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
19200 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  ct.  ){.    retu
19210 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
19220 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
19230 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d  .pTab;.  pExpr =
19240 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
19250 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  .pExpr;.  assert
19260 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d  ( pTab && !pTab-
19270 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70  >pSelect && pExp
19280 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69  r );..  if( IsVi
19290 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
192a0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
192b0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
192c0 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
192d0 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67  n 0;.  if( (pAgg
192e0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70  Info->aFunc[0].p
192f0 46 75 6e 63 2d 3e 66 6c 61 67 73 26 53 51 4c 49  Func->flags&SQLI
19300 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d  TE_FUNC_COUNT)==
19310 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
19320 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
19330 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72  &EP_Distinct ) r
19340 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75  eturn 0;..  retu
19350 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
19360 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d  * If the source-
19370 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64  list item passed
19380 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
19390 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69  was augmented wi
193a0 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44  th an.** INDEXED
193b0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
193c0 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74   try to locate t
193d0 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64  he specified ind
193e0 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  ex. If there.** 
193f0 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73  was such a claus
19400 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20  e and the named 
19410 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20  index cannot be 
19420 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a  found, return .*
19430 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61  * SQLITE_ERROR a
19440 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  nd leave an erro
19450 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68  r in pParse. Oth
19460 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65  erwise, populate
19470 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64   .** pFrom->pInd
19480 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ex and return SQ
19490 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
194a0 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
194b0 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50  Lookup(Parse *pP
194c0 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63  arse, struct Src
194d0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
194e0 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  ){.  if( pFrom->
194f0 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a  pTab && pFrom->z
19500 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 54 61 62  Index ){.    Tab
19510 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
19520 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72  ->pTab;.    char
19530 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d   *zIndex = pFrom
19540 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e  ->zIndex;.    In
19550 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66  dex *pIdx;.    f
19560 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
19570 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70  ndex; .        p
19580 49 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74  Idx && sqlite3St
19590 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d  rICmp(pIdx->zNam
195a0 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20  e, zIndex); .   
195b0 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e       pIdx=pIdx->
195c0 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20  pNext.    );.   
195d0 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20   if( !pIdx ){.  
195e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
195f0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
19600 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c  such index: %s",
19610 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20   zIndex, 0);.   
19620 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19630 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
19640 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20    pFrom->pIndex 
19650 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65  = pIdx;.  }.  re
19660 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19670 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
19680 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65  utine is a Walke
19690 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22  r callback for "
196a0 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c  expanding" a SEL
196b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
196c0 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65  * "Expanding" me
196d0 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f  ans to do the fo
196e0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
196f0 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65    (1)  Make sure
19700 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
19710 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
19720 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79  ssigned to every
19730 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d  .**         elem
19740 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
19750 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
19760 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (2)  Fill in th
19770 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
19780 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
19790 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
197a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
197b0 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  nes FROM clause.
197c0 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70    When views app
197d0 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
197e0 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20  clause,.**      
197f0 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74     fill pTabList
19800 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69  ->a[].pSelect wi
19810 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
19820 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
19830 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61  t.**         tha
19840 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
19850 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69   view.  A copy i
19860 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69  s made of the vi
19870 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20  ew's SELECT.**  
19880 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
19890 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
198a0 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72  freely modify or
198b0 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61   delete that sta
198c0 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
198d0 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69    without worryi
198e0 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67  ng about messing
198f0 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65   up the presiste
19900 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
19910 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  n.**         of 
19920 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20  the view..**.** 
19930 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d     (3)  Add term
19940 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  s to the WHERE c
19950 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64  lause to accomod
19960 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20  ate the NATURAL 
19970 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20  keyword.**      
19980 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20     on joins and 
19990 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
199a0 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73   clause of joins
199b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20  ..**.**    (4)  
199c0 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  Scan the list of
199d0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
199e0 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69  result set (pELi
199f0 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20  st) looking.**  
19a00 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61         for insta
19a10 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20  nces of the "*" 
19a20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20  operator or the 
19a30 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72  TABLE.* operator
19a40 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20  ..**         If 
19a50 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61  found, expand ea
19a60 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65  ch "*" to be eve
19a70 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65  ry column in eve
19a80 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ry table.**     
19a90 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20      and TABLE.* 
19aa0 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
19ab0 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a  mn in TABLE..**.
19ac0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
19ad0 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c  lectExpander(Wal
19ae0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
19af0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
19b00 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
19b10 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  ker->pParse;.  i
19b20 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72  nt i, j, k;.  Sr
19b30 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
19b40 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
19b50 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
19b60 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
19b70 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
19b80 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
19b90 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
19ba0 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72  Failed  ){.    r
19bb0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
19bc0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 53  .  }.  if( p->pS
19bd0 72 63 3d 3d 30 20 7c 7c 20 28 70 2d 3e 73 65 6c  rc==0 || (p->sel
19be0 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e  Flags & SF_Expan
19bf0 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ded)!=0 ){.    r
19c00 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
19c10 0a 20 20 7d 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  .  }.  p->selFla
19c20 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65  gs |= SF_Expande
19c30 64 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  d;.  pTabList = 
19c40 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
19c50 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a  t = p->pEList;..
19c60 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63    /* Make sure c
19c70 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
19c80 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
19c90 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   to all entries 
19ca0 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  in.  ** the FROM
19cb0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53   clause of the S
19cc0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
19cd0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
19ce0 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
19cf0 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  ors(pParse, pTab
19d00 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  List);..  /* Loo
19d10 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
19d20 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
19d30 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
19d40 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a   select.  If.  *
19d50 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  * an entry of th
19d60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
19d70 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74   a subquery inst
19d80 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ead of a table o
19d90 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65  r view,.  ** the
19da0 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73  n create a trans
19db0 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
19dc0 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65  ture to describe
19dd0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
19de0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
19df0 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
19e00 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
19e10 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
19e20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
19e30 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  ab;.    if( pFro
19e40 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20  m->pTab!=0 ){.  
19e50 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74      /* This stat
19e60 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64  ement has alread
19e70 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e  y been prepared.
19e80 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
19e90 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67  ed.      ** to g
19ea0 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20  o further. */.  
19eb0 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30      assert( i==0
19ec0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
19ed0 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
19ee0 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  }.    if( pFrom-
19ef0 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
19f00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19f10 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
19f20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
19f30 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
19f40 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
19f50 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
19f60 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
19f70 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
19f80 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20  rt( pSel!=0 );. 
19f90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
19fa0 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
19fb0 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
19fc0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
19fd0 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 70 46 72  pSel);.      pFr
19fe0 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
19ff0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1a000 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
1a010 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20  (Table));.      
1a020 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
1a030 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
1a040 20 20 20 20 20 20 70 54 61 62 2d 3e 64 62 4d 65        pTab->dbMe
1a050 6d 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  m = db->lookasid
1a060 65 2e 62 45 6e 61 62 6c 65 64 20 3f 20 64 62 20  e.bEnabled ? db 
1a070 3a 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  : 0;.      pTab-
1a080 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
1a090 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
1a0a0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1a0b0 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65  , "sqlite_subque
1a0c0 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29  ry_%p_", (void*)
1a0d0 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69  pTab);.      whi
1a0e0 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
1a0f0 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d   ){ pSel = pSel-
1a100 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20  >pPrior; }.     
1a110 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
1a120 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
1a130 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c  e, pSel->pEList,
1a140 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
1a150 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  Tab->aCol);.    
1a160 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
1a170 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  -1;.      pTab->
1a180 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
1a190 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66  phemeral;.#endif
1a1a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a1b0 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
1a1c0 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
1a1d0 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
1a1e0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
1a1f0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
1a200 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
1a210 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
1a220 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71  ab = .        sq
1a230 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
1a240 28 70 50 61 72 73 65 2c 30 2c 70 46 72 6f 6d 2d  (pParse,0,pFrom-
1a250 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44  >zName,pFrom->zD
1a260 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20  atabase);.      
1a270 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
1a280 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
1a290 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
1a2a0 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ++;.#if !defined
1a2b0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1a2c0 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28  W) || !defined (
1a2d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1a2e0 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20  UALTABLE).      
1a2f0 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
1a300 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70  t || IsVirtual(p
1a310 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
1a320 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65  /* We reach here
1a330 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
1a340 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20  ble is a really 
1a350 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  a view */.      
1a360 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65    if( sqlite3Vie
1a370 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
1a380 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 20  pParse, pTab) ) 
1a390 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1a3a0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;..        /* If
1a3b0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21   pFrom->pSelect!
1a3c0 3d 30 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  =0 it means we a
1a3d0 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
1a3e0 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 69 65  a.        ** vie
1a3f0 77 20 77 69 74 68 69 6e 20 61 20 76 69 65 77 2e  w within a view.
1a400 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 72    The SELECT str
1a410 75 63 74 75 72 65 20 68 61 73 20 61 6c 72 65 61  ucture has alrea
1a420 64 79 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  dy been.        
1a430 2a 2a 20 63 6f 70 69 65 64 20 62 79 20 74 68 65  ** copied by the
1a440 20 6f 75 74 65 72 20 76 69 65 77 20 73 6f 20 77   outer view so w
1a450 65 20 63 61 6e 20 73 6b 69 70 20 74 68 65 20 63  e can skip the c
1a460 6f 70 79 20 73 74 65 70 20 68 65 72 65 0a 20 20  opy step here.  
1a470 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
1a480 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20 20 20 20  inner view..    
1a490 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1a4a0 66 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  f( pFrom->pSelec
1a4b0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1a4c0 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
1a4d0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
1a4e0 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  Dup(db, pTab->pS
1a4f0 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20  elect, 0);.     
1a500 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
1a510 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
1a520 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pFrom->pSelect);
1a530 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a540 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
1a550 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  .    /* Locate t
1a560 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62  he index named b
1a570 79 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59  y the INDEXED BY
1a580 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e   clause, if any.
1a590 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
1a5a0 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
1a5b0 75 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d  up(pParse, pFrom
1a5c0 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1a5d0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
1a5e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f   }.  }..  /* Pro
1a5f0 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79  cess NATURAL key
1a600 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e  words, and ON an
1a610 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
1a620 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20  of joins..  */. 
1a630 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1a640 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50  ailed || sqliteP
1a650 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73  rocessJoin(pPars
1a660 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74  e, p) ){.    ret
1a670 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
1a680 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65   }..  /* For eve
1a690 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75  ry "*" that occu
1a6a0 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rs in the column
1a6b0 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68   list, insert th
1a6c0 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20  e names of.  ** 
1a6d0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
1a6e0 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20  ll tables.  And 
1a6f0 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e  for every TABLE.
1a700 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  * insert the nam
1a710 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63  es.  ** of all c
1a720 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e  olumns in TABLE.
1a730 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73    The parser ins
1a740 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20  erted a special 
1a750 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
1a760 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20  with the TK_ALL 
1a770 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63  operator for eac
1a780 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f  h "*" that it fo
1a790 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  und in the colum
1a7a0 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65  n list..  ** The
1a7b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
1a7c0 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61  just has to loca
1a7d0 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78  te the TK_ALL ex
1a7e0 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78  pressions and ex
1a7f0 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f  pand.  ** each o
1a800 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ne to the list o
1a810 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
1a820 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a   all tables..  *
1a830 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
1a840 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b   loop just check
1a850 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  s to see if ther
1a860 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70  e are any "*" op
1a870 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61  erators.  ** tha
1a880 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67  t need expanding
1a890 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30  ..  */.  for(k=0
1a8a0 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
1a8b0 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; k++){.    Exp
1a8c0 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e  r *pE = pEList->
1a8d0 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
1a8e0 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  if( pE->op==TK_A
1a8f0 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  LL ) break;.    
1a900 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
1a910 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  OT && pE->pRight
1a920 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   && pE->pRight->
1a930 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20  op==TK_ALL.     
1a940 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65 66 74      && pE->pLeft
1a950 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f   && pE->pLeft->o
1a960 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65 61 6b  p==TK_ID ) break
1a970 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45  ;.  }.  if( k<pE
1a980 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
1a990 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
1a9a0 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
1a9b0 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
1a9c0 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
1a9d0 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
1a9e0 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
1a9f0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
1aa00 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
1aa10 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
1aa20 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
1aa30 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
1aa40 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
1aa50 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
1aa60 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
1aa70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
1aa80 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
1aa90 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
1aaa0 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  0;.    int flags
1aab0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66   = pParse->db->f
1aac0 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f  lags;.    int lo
1aad0 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73  ngNames = (flags
1aae0 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
1aaf0 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20  lNames)!=0.     
1ab00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab10 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c   && (flags & SQL
1ab20 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
1ab30 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28  s)==0;..    for(
1ab40 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
1ab50 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
1ab60 20 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b    Expr *pE = a[k
1ab70 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
1ab80 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  f( pE->op!=TK_AL
1ab90 4c 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  L &&.           
1aba0 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20  (pE->op!=TK_DOT 
1abb0 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30  || pE->pRight==0
1abc0 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   || pE->pRight->
1abd0 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20  op!=TK_ALL) ){. 
1abe0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70         /* This p
1abf0 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73  articular expres
1ac00 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  sion does not ne
1ac10 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
1ac20 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
1ac30 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
1ac40 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
1ac50 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
1ac60 20 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b   a[k].pExpr, 0);
1ac70 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
1ac80 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  w ){.          p
1ac90 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
1aca0 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b  pr-1].zName = a[
1acb0 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  k].zName;.      
1acc0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
1acd0 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
1ace0 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d      a[k].zName =
1acf0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1ad00 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
1ad10 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
1ad20 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45   "*" or a "TABLE
1ad30 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  .*" and needs to
1ad40 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   be.        ** e
1ad50 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  xpanded. */.    
1ad60 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65      int tableSee
1ad70 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53  n = 0;      /* S
1ad80 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42  et to 1 when TAB
1ad90 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  LE matches */.  
1ada0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61        char *zTNa
1adb0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
1adc0 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f  * text of name o
1add0 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20  f TABLE */.     
1ade0 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
1adf0 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65  K_DOT && pE->pLe
1ae00 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
1ae10 7a 54 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  zTName = sqlite3
1ae20 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1ae30 2c 20 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f  , &pE->pLeft->to
1ae40 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ken);.        }e
1ae50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
1ae60 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  TName = 0;.     
1ae70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
1ae80 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
1ae90 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
1aea0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
1aeb0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
1aec0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
1aed0 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
1aee0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
1aef0 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d  TabName = pFrom-
1af00 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
1af10 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
1af20 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30  =0 || zTabName[0
1af30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  ]==0 ){ .       
1af40 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
1af50 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
1af60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1af70 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
1af80 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b  cFailed ) break;
1af90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
1afa0 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33  TName && sqlite3
1afb0 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20  StrICmp(zTName, 
1afc0 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  zTabName)!=0 ){.
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
1afe0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1aff0 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61 62 6c  }.          tabl
1b000 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  eSeen = 1;.     
1b010 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1b020 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
1b030 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
1b040 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 52 69 67  pr *pExpr, *pRig
1b050 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
1b060 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54  char *zName = pT
1b070 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
1b080 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
1b090 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69  /* If a column i
1b0a0 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64  s marked as 'hid
1b0b0 64 65 6e 27 20 28 63 75 72 72 65 6e 74 6c 79 20  den' (currently 
1b0c0 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20 20  only possible.  
1b0d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72            ** for
1b0e0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 29   virtual tables)
1b0f0 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65  , do not include
1b100 20 69 74 20 69 6e 20 74 68 65 20 65 78 70 61 6e   it in the expan
1b110 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ded.            
1b120 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69  ** result-set li
1b130 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  st..            
1b140 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
1b150 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d  f( IsHiddenColum
1b160 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  n(&pTab->aCol[j]
1b170 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1b180 20 20 20 61 73 73 65 72 74 28 49 73 56 69 72 74     assert(IsVirt
1b190 75 61 6c 28 70 54 61 62 29 29 3b 0a 20 20 20 20  ual(pTab));.    
1b1a0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1b1b0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
1b1c0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  }..            i
1b1d0 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65  f( i>0 && zTName
1b1e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1b1f0 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
1b200 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20  ist_item *pLeft 
1b210 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
1b220 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -1];.           
1b230 20 20 20 69 66 28 20 28 70 4c 65 66 74 5b 31 5d     if( (pLeft[1]
1b240 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  .jointype & JT_N
1b250 41 54 55 52 41 4c 29 21 3d 30 20 26 26 0a 20 20  ATURAL)!=0 &&.  
1b260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b270 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65        columnInde
1b280 78 28 70 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a  x(pLeft->pTab, z
1b290 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1b2b0 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e  n a NATURAL join
1b2c0 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20  , omit the join 
1b2d0 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65  columns from the
1b2e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1b2f0 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68    ** table on th
1b300 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 20  e right */.     
1b310 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
1b320 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
1b330 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1b340 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64     if( sqlite3Id
1b350 4c 69 73 74 49 6e 64 65 78 28 70 4c 65 66 74 5b  ListIndex(pLeft[
1b360 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65  1].pUsing, zName
1b370 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
1b380 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
1b390 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e  join with a USIN
1b3a0 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63  G clause, omit c
1b3b0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20  olumns in the.  
1b3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1b3d0 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72   using clause fr
1b3e0 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  om the table on 
1b3f0 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20  the right. */.  
1b400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
1b410 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1b420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b430 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1b440 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74    pRight = sqlit
1b450 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
1b460 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b  TK_ID, 0, 0, 0);
1b470 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1b480 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65   pRight==0 ) bre
1b490 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
1b4a0 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28 70  setQuotedToken(p
1b4b0 50 61 72 73 65 2c 20 26 70 52 69 67 68 74 2d 3e  Parse, &pRight->
1b4c0 74 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20  token, zName);. 
1b4d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
1b4e0 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62  ongNames || pTab
1b4f0 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a  List->nSrc>1 ){.
1b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
1b510 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69  pr *pLeft = sqli
1b520 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
1b530 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29   TK_ID, 0, 0, 0)
1b540 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b550 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
1b560 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
1b570 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  DOT, pLeft, pRig
1b580 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
1b590 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 3d        if( pExpr=
1b5a0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1b5b0 20 20 20 20 20 20 20 20 20 20 73 65 74 51 75 6f            setQuo
1b5c0 74 65 64 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c  tedToken(pParse,
1b5d0 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20   &pLeft->token, 
1b5e0 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zTabName);.     
1b5f0 20 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b 65           setToke
1b600 6e 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20  n(&pExpr->span, 
1b610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b620 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
1b630 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a  f(db, "%s.%s", z
1b640 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29  TabName, zName))
1b650 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b660 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20  pExpr->span.dyn 
1b670 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
1b680 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
1b690 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  z = 0;.         
1b6a0 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
1b6b0 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  n.n = 0;.       
1b6c0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
1b6d0 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20  ken.dyn = 0;.   
1b6e0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1b700 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  xpr = pRight;.  
1b710 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1b720 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d  r->span = pExpr-
1b730 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
1b740 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
1b750 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20  n.dyn = 0;.     
1b760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b770 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
1b780 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
1b790 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1b7a0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
1b7b0 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
1b7c0 45 78 70 72 2c 20 26 70 45 78 70 72 2d 3e 73 70  Expr, &pExpr->sp
1b7d0 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  an);.           
1b7e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b7f0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
1b800 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
1b810 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
1b820 20 70 45 78 70 72 2c 20 26 70 52 69 67 68 74 2d   pExpr, &pRight-
1b830 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20  >token);.       
1b840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b850 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1b860 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
1b870 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
1b880 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20   if( zTName ){. 
1b890 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1b8a0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1b8b0 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
1b8c0 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b  e: %s", zTName);
1b8d0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1b8e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1b8f0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1b900 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73  arse, "no tables
1b910 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20   specified");.  
1b920 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b930 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
1b940 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54  te3DbFree(db, zT
1b950 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
1b960 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1b970 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
1b980 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b, pEList);.    
1b990 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77  p->pEList = pNew
1b9a0 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  ;.  }.#if SQLITE
1b9b0 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
1b9c0 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
1b9d0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ->pEList->nExpr>
1b9e0 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
1b9f0 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
1ba00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1ba10 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1ba20 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
1ba30 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29   in result set")
1ba40 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
1ba50 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
1ba60 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d  ue;.}../*.** No-
1ba70 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74  op routine for t
1ba80 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61  he parse-tree wa
1ba90 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  lker..**.** When
1baa0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1bab0 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70   the Walker.xExp
1bac0 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65  rCallback then e
1bad0 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a  xpression trees.
1bae0 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69  ** are walked wi
1baf0 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e  thout any action
1bb00 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74  s being taken at
1bb10 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65   each node.  Pre
1bb20 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e  sumably,.** when
1bb30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1bb40 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72   used for Walker
1bb50 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
1bb60 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78  hen .** Walker.x
1bb70 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69  SelectCallback i
1bb80 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65  s set to do some
1bb90 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72  thing useful for
1bba0 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75   every .** subqu
1bbb0 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65  ery in the parse
1bbc0 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  r tree..*/.stati
1bbd0 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f  c int exprWalkNo
1bbe0 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  op(Walker *NotUs
1bbf0 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65  ed, Expr *NotUse
1bc00 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
1bc10 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
1bc20 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
1bc30 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
1bc40 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ue;.}../*.** Thi
1bc50 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e  s routine "expan
1bc60 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ds" a SELECT sta
1bc70 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f  tement and all o
1bc80 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73  f its subqueries
1bc90 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f  ..** For additio
1bca0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
1bcb0 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73  on what it means
1bcc0 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53   to "expand" a S
1bcd0 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
1bce0 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d  nt, see the comm
1bcf0 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63  ent on the selec
1bd00 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63  tExpand worker c
1bd10 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a  allback above..*
1bd20 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61  *.** Expanding a
1bd30 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1bd40 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  t is the first s
1bd50 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e  tep in processin
1bd60 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  g a.** SELECT st
1bd70 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45  atement.  The SE
1bd80 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d  LECT statement m
1bd90 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20  ust be expanded 
1bda0 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72  before.** name r
1bdb0 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72  esolution is per
1bdc0 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  formed..**.** If
1bdd0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
1bde0 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d  rong, an error m
1bdf0 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65  essage is writte
1be00 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a  n into pParse..*
1be10 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
1be20 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63  nction can detec
1be30 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79  t the problem by
1be40 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72   looking at pPar
1be50 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f  se->nErr.** and/
1be60 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  or pParse->db->m
1be70 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a  allocFailed..*/.
1be80 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
1be90 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
1bea0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1beb0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
1bec0 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
1bed0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
1bee0 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65   = selectExpande
1bef0 72 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  r;.  w.xExprCall
1bf00 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e  back = exprWalkN
1bf10 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
1bf20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
1bf30 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
1bf40 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a  , pSelect);.}...
1bf50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1bf60 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
1bf70 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c  ** This is a Wal
1bf80 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
1bf90 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ack callback for
1bfa0 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65   the sqlite3Sele
1bfb0 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20  ctTypeInfo().** 
1bfc0 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
1bfd0 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63   For each FROM-c
1bfe0 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20  lause subquery, 
1bff0 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  add Column.zType
1c000 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c   and Column.zCol
1c010 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
1c020 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74   to the Table st
1c030 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
1c040 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
1c050 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61  lt set.** of tha
1c060 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  t subquery..**.*
1c070 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
1c080 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
1c090 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
1c0a0 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75   set was constru
1c0b0 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63  cted.** by selec
1c0c0 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20  tExpander() but 
1c0d0 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  the type and col
1c0e0 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
1c0f0 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a  on was omitted.*
1c100 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  * at that point 
1c110 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69  because identifi
1c120 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ers had not yet 
1c130 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20  been resolved.  
1c140 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
1c150 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
1c160 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c  identifier resol
1c170 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
1c180 20 69 6e 74 20 73 65 6c 65 63 74 41 64 64 53 75   int selectAddSu
1c190 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57  bqueryTypeInfo(W
1c1a0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
1c1b0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
1c1c0 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69  rse *pParse;.  i
1c1d0 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20  nt i;.  SrcList 
1c1e0 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  *pTabList;.  str
1c1f0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1c200 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65   *pFrom;..  asse
1c210 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
1c220 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b  & SF_Resolved );
1c230 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1c240 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
1c250 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Info)==0 ){.    
1c260 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
1c270 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20  F_HasTypeInfo;. 
1c280 20 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c     pParse = pWal
1c290 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  ker->pParse;.   
1c2a0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
1c2b0 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Src;.    for(i=0
1c2c0 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
1c2d0 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
1c2e0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
1c2f0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  m++){.      Tabl
1c300 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
1c310 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  >pTab;.      if(
1c320 20 70 54 61 62 20 26 26 20 28 70 54 61 62 2d 3e   pTab && (pTab->
1c330 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
1c340 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20  hemeral)!=0 ){. 
1c350 20 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d         /* A sub-
1c360 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
1c370 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
1c380 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 20 20  LECT */.        
1c390 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
1c3a0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
1c3b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1c3c0 53 65 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 77  Sel );.        w
1c3d0 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69  hile( pSel->pPri
1c3e0 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c  or ) pSel = pSel
1c3f0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
1c400 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d    selectAddColum
1c410 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
1c420 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  n(pParse, pTab->
1c430 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  nCol, pTab->aCol
1c440 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d  , pSel);.      }
1c450 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1c460 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
1c470 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
1c480 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1c490 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e  adds datatype an
1c4a0 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
1c4b0 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ence information
1c4c0 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65   to.** the Table
1c4d0 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61   structures of a
1c4e0 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
1c4f0 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a  ubqueries in a.*
1c500 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
1c510 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  nt..**.** Use th
1c520 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72  is routine after
1c530 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
1c540 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1c550 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
1c560 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20  dTypeInfo(Parse 
1c570 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
1c580 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64  *pSelect){.#ifnd
1c590 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1c5a0 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72  UBQUERY.  Walker
1c5b0 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43   w;.  w.xSelectC
1c5c0 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
1c5d0 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
1c5e0 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  nfo;.  w.xExprCa
1c5f0 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c  llback = exprWal
1c600 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
1c610 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
1c620 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
1c630 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65  &w, pSelect);.#e
1c640 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.}.../*.** T
1c650 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
1c660 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
1c670 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65  tement for proce
1c680 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66  ssing.  The.** f
1c690 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f  ollowing is acco
1c6a0 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20  mplished:.**.** 
1c6b0 20 20 20 20 2a 20 20 56 44 42 45 20 43 75 72 73      *  VDBE Curs
1c6c0 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  or numbers are a
1c6d0 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46  ssigned to all F
1c6e0 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM-clause terms
1c6f0 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65  ..**     *  Ephe
1c700 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65  meral Table obje
1c710 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64 20  cts are created 
1c720 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61  for all FROM-cla
1c730 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a  use subqueries..
1c740 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64  **     *  ON and
1c750 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61   USING clauses a
1c760 72 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20  re shifted into 
1c770 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73  WHERE statements
1c780 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63  .**     *  Wildc
1c790 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41  ards "*" and "TA
1c7a0 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74  BLE.*" in result
1c7b0 20 73 65 74 73 20 61 72 65 20 65 78 70 61 6e 64   sets are expand
1c7c0 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64  ed..**     *  Id
1c7d0 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78 70  entifiers in exp
1c7e0 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63  ression are matc
1c7f0 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a  hed to tables..*
1c800 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1c810 65 20 61 63 74 73 20 72 65 63 75 72 73 69 76 65  e acts recursive
1c820 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65  ly on all subque
1c830 72 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ries within the 
1c840 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
1c850 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
1c860 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
1c870 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
1c880 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
1c890 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
1c8a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1c8b0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
1c8c0 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
1c8d0 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  d. */.  NameCont
1c8e0 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f  ext *pOuterNC  /
1c8f0 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
1c900 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a  or container */.
1c910 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1c920 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1c930 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50  eturn;.  db = pP
1c940 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
1c950 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1c960 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72  _HasTypeInfo ) r
1c970 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
1c980 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
1c990 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1c9a0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
1c9b0 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50  3SelectExpand(pP
1c9c0 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20  arse, p);.  if( 
1c9d0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
1c9e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c9f0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
1ca00 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63  ite3ResolveSelec
1ca10 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  tNames(pParse, p
1ca20 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69  , pOuterNC);.  i
1ca30 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1ca40 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1ca50 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
1ca60 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
1ca70 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c  TypeInfo(pParse,
1ca80 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
1ca90 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
1caa0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  e accumulator..*
1cab0 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61  *.** The aggrega
1cac0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69  te accumulator i
1cad0 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72  s a set of memor
1cae0 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c  y cells that hol
1caf0 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74  d.** intermediat
1cb00 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20  e results while 
1cb10 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61  calculating an a
1cb20 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a  ggregate.  This.
1cb30 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c  ** routine simpl
1cb40 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69  y stores NULLs i
1cb50 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d  n all of those m
1cb60 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  emory cells..*/.
1cb70 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65  static void rese
1cb80 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  tAccumulator(Par
1cb90 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
1cba0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
1cbb0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1cbc0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1cbd0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
1cbe0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63  Info_func *pFunc
1cbf0 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f  ;.  if( pAggInfo
1cc00 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f  ->nFunc+pAggInfo
1cc10 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a  ->nColumn==0 ){.
1cc20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1cc30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
1cc40 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  gInfo->nColumn; 
1cc50 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1cc60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1cc70 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49  P_Null, 0, pAggI
1cc80 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
1cc90 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46  m);.  }.  for(pF
1cca0 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46  unc=pAggInfo->aF
1ccb0 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67  unc, i=0; i<pAgg
1ccc0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
1ccd0 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20  , pFunc++){.    
1cce0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ccf0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1cd00 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20   pFunc->iMem);. 
1cd10 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44     if( pFunc->iD
1cd20 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
1cd30 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
1cd40 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Func->pExpr;.   
1cd50 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1cd60 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
1cd70 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1cd80 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78  .      if( pE->x
1cd90 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  .pList==0 || pE-
1cda0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  >x.pList->nExpr!
1cdb0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
1cdc0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1cdd0 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20  arse, "DISTINCT 
1cde0 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20  aggregates must 
1cdf0 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
1ce00 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
1ce10 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20  rgument");.     
1ce20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69     pFunc->iDisti
1ce30 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
1ce40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b  }else{.        K
1ce50 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1ce60 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
1ce70 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
1ce80 45 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  E->x.pList);.   
1ce90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1cea0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
1ceb0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e  nEphemeral, pFun
1cec0 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c  c->iDistinct, 0,
1ced0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1cee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1cef0 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
1cf00 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
1cf10 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  F);.      }.    
1cf20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
1cf30 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67  nvoke the OP_Agg
1cf40 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20  Finalize opcode 
1cf50 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67  for every aggreg
1cf60 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
1cf70 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  in the AggInfo s
1cf80 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
1cf90 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a  tic void finaliz
1cfa0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61  eAggFunctions(Pa
1cfb0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
1cfc0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
1cfd0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1cfe0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1cff0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
1d000 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
1d010 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
1d020 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
1d030 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
1d040 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
1d050 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1d060 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
1d070 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
1d080 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1d090 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
1d0a0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1d0b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d0c0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67  AddOp4(v, OP_Agg
1d0d0 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c  Final, pF->iMem,
1d0e0 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
1d0f0 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20  nExpr : 0, 0,.  
1d100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d110 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70      (void*)pF->p
1d120 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
1d130 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1d140 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d  Update the accum
1d150 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65  ulator memory ce
1d160 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65  lls for an aggre
1d170 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  gate based on.**
1d180 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
1d190 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
1d1a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64  .static void upd
1d1b0 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  ateAccumulator(P
1d1c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
1d1d0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
1d1e0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1d1f0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1d200 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
1d210 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
1d220 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
1d230 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41  o_col *pC;..  pA
1d240 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
1d250 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  de = 1;.  for(i=
1d260 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
1d270 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
1d280 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
1d290 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41  F++){.    int nA
1d2a0 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  rg;.    int addr
1d2b0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Next = 0;.    in
1d2c0 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78  t regAgg;.    Ex
1d2d0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
1d2e0 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
1d2f0 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
1d300 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1d310 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
1d320 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
1d330 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
1d340 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74      nArg = pList
1d350 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
1d360 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47  egAgg = sqlite3G
1d370 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
1d380 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20  se, nArg);.     
1d390 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d3a0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1d3b0 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20   pList, regAgg, 
1d3c0 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1d3d0 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20       nArg = 0;. 
1d3e0 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b       regAgg = 0;
1d3f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1d400 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  F->iDistinct>=0 
1d410 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78  ){.      addrNex
1d420 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
1d430 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1d440 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d     assert( nArg=
1d450 3d 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  =1 );.      code
1d460 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
1d470 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20   pF->iDistinct, 
1d480 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67  addrNext, 1, reg
1d490 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Agg);.    }.    
1d4a0 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66  if( pF->pFunc->f
1d4b0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
1d4c0 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
1d4d0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
1d4e0 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  oll = 0;.      s
1d4f0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1d500 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
1d510 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61    int j;.      a
1d520 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
1d530 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20  );  /* pList!=0 
1d540 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73  if pF->pFunc has
1d550 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20   NEEDCOLL */.   
1d560 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
1d570 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f  m=pList->a; !pCo
1d580 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b  ll && j<nArg; j+
1d590 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1d5a0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
1d5b0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1d5c0 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
1d5d0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
1d5e0 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
1d5f0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
1d600 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
1d610 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
1d620 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
1d630 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1d640 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30  CollSeq, 0, 0, 0
1d650 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
1d660 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
1d670 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1d680 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1d690 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41  AggStep, 0, regA
1d6a0 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20  gg, pF->iMem,.  
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6c0 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70      (void*)pF->p
1d6d0 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
1d6e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1d6f0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
1d700 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  8)nArg);.    sql
1d710 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1d720 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
1d730 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  Agg, nArg);.    
1d740 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1d750 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
1d760 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e  Parse, regAgg, n
1d770 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64  Arg);.    if( ad
1d780 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  drNext ){.      
1d790 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1d7a0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e  veLabel(v, addrN
1d7b0 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ext);.    }.  }.
1d7c0 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41    for(i=0, pC=pA
1d7d0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c  ggInfo->aCol; i<
1d7e0 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
1d7f0 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b  ulator; i++, pC+
1d800 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
1d810 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1d820 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69  pC->pExpr, pC->i
1d830 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67  Mem);.  }.  pAgg
1d840 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
1d850 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = 0;.}../*.** G
1d860 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1d870 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
1d880 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74  ement given in t
1d890 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20  he p argument.  
1d8a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
1d8b0 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74  ts are distribut
1d8c0 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61  ed in various wa
1d8d0 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ys depending on 
1d8e0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
1d8f0 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44 65 73  of the SelectDes
1d900 74 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  t structure poin
1d910 74 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d 65  ted to by argume
1d920 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20 66  nt pDest.** as f
1d930 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1d940 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 20    pDest->eDest  
1d950 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20    Result.**     
1d960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
1d970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
1d9a0 20 20 20 53 52 54 5f 4f 75 74 70 75 74 20 20 20     SRT_Output   
1d9b0 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 72 6f     Generate a ro
1d9c0 77 20 6f 66 20 6f 75 74 70 75 74 20 28 75 73 69  w of output (usi
1d9d0 6e 67 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74  ng the OP_Result
1d9e0 52 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  Row.**          
1d9f0 20 20 20 20 20 20 20 20 20 20 20 6f 70 63 6f 64             opcod
1da00 65 29 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  e) for each row 
1da10 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
1da20 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  t..**.**     SRT
1da30 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 4f 6e 6c  _Mem         Onl
1da40 79 20 76 61 6c 69 64 20 69 66 20 74 68 65 20 72  y valid if the r
1da50 65 73 75 6c 74 20 69 73 20 61 20 73 69 6e 67 6c  esult is a singl
1da60 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20  e column..**    
1da70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da80 20 53 74 6f 72 65 20 74 68 65 20 66 69 72 73 74   Store the first
1da90 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66   column of the f
1daa0 69 72 73 74 20 72 65 73 75 6c 74 20 72 6f 77 0a  irst result row.
1dab0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1dac0 20 20 20 20 20 20 20 69 6e 20 72 65 67 69 73 74         in regist
1dad0 65 72 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20  er pDest->iParm 
1dae0 74 68 65 6e 20 61 62 61 6e 64 6f 6e 20 74 68 65  then abandon the
1daf0 20 72 65 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   rest.**        
1db00 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
1db10 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73  the query.  This
1db20 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 6d 70   destination imp
1db30 6c 69 65 73 20 22 4c 49 4d 49 54 20 31 22 2e 0a  lies "LIMIT 1"..
1db40 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65  **.**     SRT_Se
1db50 74 20 20 20 20 20 20 20 20 20 54 68 65 20 72 65  t         The re
1db60 73 75 6c 74 20 6d 75 73 74 20 62 65 20 61 20 73  sult must be a s
1db70 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20 53  ingle column.  S
1db80 74 6f 72 65 20 65 61 63 68 0a 2a 2a 20 20 20 20  tore each.**    
1db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dba0 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 20 61   row of result a
1dbb0 73 20 74 68 65 20 6b 65 79 20 69 6e 20 74 61 62  s the key in tab
1dbc0 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e  le pDest->iParm.
1dbd0 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
1dbe0 20 20 20 20 20 20 20 20 20 41 70 70 6c 79 20 74           Apply t
1dbf0 68 65 20 61 66 66 69 6e 69 74 79 20 70 44 65 73  he affinity pDes
1dc00 74 2d 3e 61 66 66 69 6e 69 74 79 20 62 65 66 6f  t->affinity befo
1dc10 72 65 20 73 74 6f 72 69 6e 67 0a 2a 2a 20 20 20  re storing.**   
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc30 20 20 72 65 73 75 6c 74 73 2e 20 20 55 73 65 64    results.  Used
1dc40 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 49   to implement "I
1dc50 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e  N (SELECT ...)".
1dc60 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55  .**.**     SRT_U
1dc70 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65  nion       Store
1dc80 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65   results as a ke
1dc90 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  y in a temporary
1dca0 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50   table pDest->iP
1dcb0 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  arm..**.**     S
1dcc0 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20 52  RT_Except      R
1dcd0 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66 72  emove results fr
1dce0 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  om the temporary
1dcf0 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50   table pDest->iP
1dd00 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  arm..**.**     S
1dd10 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53  RT_Table       S
1dd20 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20  tore results in 
1dd30 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1dd40 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a  pDest->iParm..**
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd60 20 20 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b       This is lik
1dd70 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 65  e SRT_EphemTab e
1dd80 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74  xcept that the t
1dd90 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  able.**         
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 61              is a
1ddb0 73 73 75 6d 65 64 20 74 6f 20 61 6c 72 65 61 64  ssumed to alread
1ddc0 79 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a  y be open..**.**
1ddd0 20 20 20 20 20 53 52 54 5f 45 70 68 65 6d 54 61       SRT_EphemTa
1dde0 62 20 20 20 20 43 72 65 61 74 65 20 61 6e 20 74  b    Create an t
1ddf0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70  emporary table p
1de00 44 65 73 74 2d 3e 69 50 61 72 6d 20 61 6e 64 20  Dest->iParm and 
1de10 73 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  store.**        
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
1de30 20 72 65 73 75 6c 74 20 74 68 65 72 65 2e 20 54   result there. T
1de40 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1de50 74 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20  t open after.** 
1de60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de70 20 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 20 20      returning.  
1de80 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54  This is like SRT
1de90 5f 54 61 62 6c 65 20 65 78 63 65 70 74 20 74 68  _Table except th
1dea0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
1deb0 20 20 20 20 20 20 20 20 20 20 74 68 69 73 20 64            this d
1dec0 65 73 74 69 6e 61 74 69 6f 6e 20 75 73 65 73 20  estination uses 
1ded0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1dee0 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 20 20   to create.**   
1def0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df00 20 20 74 68 65 20 74 61 62 6c 65 20 66 69 72 73    the table firs
1df10 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  t..**.**     SRT
1df20 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20 47 65 6e  _Coroutine   Gen
1df30 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74 69  erate a co-routi
1df40 6e 65 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ne that returns 
1df50 61 20 6e 65 77 20 72 6f 77 20 6f 66 0a 2a 2a 20  a new row of.** 
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df70 20 20 20 20 72 65 73 75 6c 74 73 20 65 61 63 68      results each
1df80 20 74 69 6d 65 20 69 74 20 69 73 20 69 6e 76 6f   time it is invo
1df90 6b 65 64 2e 20 20 54 68 65 20 65 6e 74 72 79 20  ked.  The entry 
1dfa0 70 6f 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  point.**        
1dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
1dfc0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69  the co-routine i
1dfd0 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
1dfe0 73 74 65 72 20 70 44 65 73 74 2d 3e 69 50 61 72  ster pDest->iPar
1dff0 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
1e000 5f 45 78 69 73 74 73 20 20 20 20 20 20 53 74 6f  _Exists      Sto
1e010 72 65 20 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79  re a 1 in memory
1e020 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61   cell pDest->iPa
1e030 72 6d 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  rm if the result
1e040 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1e050 20 20 20 20 20 20 20 20 73 65 74 20 69 73 20 6e          set is n
1e060 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  ot empty..**.** 
1e070 20 20 20 20 53 52 54 5f 44 69 73 63 61 72 64 20      SRT_Discard 
1e080 20 20 20 20 54 68 72 6f 77 20 74 68 65 20 72 65      Throw the re
1e090 73 75 6c 74 73 20 61 77 61 79 2e 20 20 54 68 69  sults away.  Thi
1e0a0 73 20 69 73 20 75 73 65 64 20 62 79 20 53 45 4c  s is used by SEL
1e0b0 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ECT.**          
1e0c0 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
1e0d0 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72 69  ments within tri
1e0e0 67 67 65 72 73 20 77 68 6f 73 65 20 6f 6e 6c 79  ggers whose only
1e0f0 20 70 75 72 70 6f 73 65 20 69 73 0a 2a 2a 20 20   purpose is.**  
1e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e110 20 20 20 74 68 65 20 73 69 64 65 2d 65 66 66 65     the side-effe
1e120 63 74 73 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73  cts of functions
1e130 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1e140 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
1e150 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
1e160 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72  s.  If any error
1e170 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74  s are.** encount
1e180 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70  ered, then an ap
1e190 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
1e1a0 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
1e1b0 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45  in.** pParse->zE
1e1c0 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rrMsg..**.** Thi
1e1d0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e  s routine does N
1e1e0 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65  OT free the Sele
1e1f0 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  ct structure pas
1e200 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20  sed in.  The.** 
1e210 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1e220 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61   needs to do tha
1e230 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1e240 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  3Select(.  Parse
1e250 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1e260 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
1e270 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
1e280 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1e290 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
1e2a0 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
1e2b0 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65  g coded. */.  Se
1e2c0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
1e2d0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
1e2e0 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72  do with the quer
1e2f0 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
1e300 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
1e310 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1e320 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
1e330 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1e340 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ;     /* Return 
1e350 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72  from sqlite3Wher
1e360 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64  eBegin() */.  Vd
1e370 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
1e380 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
1e390 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65  ual machine unde
1e3a0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
1e3b0 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20  /.  int isAgg;  
1e3c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1e3d0 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69  ue for select li
1e3e0 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  sts like "count(
1e3f0 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  *)" */.  ExprLis
1e400 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
1e410 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
1e420 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a  ns to extract. *
1e430 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
1e440 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69  bList;     /* Li
1e450 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
1e460 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
1e470 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
1e480 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1e490 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
1e4a0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
1e4b0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
1e4c0 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  y;    /* The ORD
1e4d0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  ER BY clause.  M
1e4e0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1e4f0 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
1e500 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52  By;    /* The GR
1e510 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
1e520 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
1e530 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20   Expr *pHaving; 
1e540 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48          /* The H
1e550 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d  AVING clause.  M
1e560 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1e570 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20  int isDistinct; 
1e580 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1e590 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
1e5a0 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
1e5b0 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69  t */.  int disti
1e5c0 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nct;          /*
1e5d0 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f   Table to use fo
1e5e0 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
1e5f0 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  et */.  int rc =
1e600 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
1e610 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
1e620 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
1e630 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
1e640 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
1e650 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
1e660 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  n OP_OpenEphemer
1e670 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a  al instruction *
1e680 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67  /.  AggInfo sAgg
1e690 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e  Info;      /* In
1e6a0 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62  formation used b
1e6b0 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  y aggregate quer
1e6c0 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e  ies */.  int iEn
1e6d0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1e6e0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1e6f0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65  e end of the que
1e700 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ry */.  sqlite3 
1e710 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *db;           /
1e720 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
1e730 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
1e740 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1e750 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64  .  if( p==0 || d
1e760 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1e770 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
1e780 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1e790 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
1e7a0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1e7b0 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
1e7c0 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
1e7d0 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74  turn 1;.  memset
1e7e0 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73  (&sAggInfo, 0, s
1e7f0 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29  izeof(sAggInfo))
1e800 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  ;..  pOrderBy = 
1e810 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
1e820 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
1e830 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
1e840 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
1e850 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68  0;..    /* In th
1e860 65 73 65 20 63 61 73 65 73 20 74 68 65 20 44 49  ese cases the DI
1e870 53 54 49 4e 43 54 20 6f 70 65 72 61 74 6f 72 20  STINCT operator 
1e880 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65  makes no differe
1e890 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  nce to the.    *
1e8a0 2a 20 72 65 73 75 6c 74 73 2c 20 73 6f 20 72 65  * results, so re
1e8b0 6d 6f 76 65 20 69 74 20 69 66 20 69 74 20 77 65  move it if it we
1e8c0 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20  re specified..  
1e8d0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1e8e0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1e8f0 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73  T_Exists || pDes
1e900 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e  t->eDest==SRT_Un
1e910 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ion || .        
1e920 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
1e930 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70  =SRT_Except || p
1e940 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
1e950 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20 70  _Discard);.    p
1e960 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
1e970 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  F_Distinct;.  }.
1e980 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
1e990 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30  rep(pParse, p, 0
1e9a0 29 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  );.  pTabList = 
1e9b0 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
1e9c0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
1e9d0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1e9e0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1e9f0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
1ea00 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1ea10 7d 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  }.  p->pOrderBy 
1ea20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 73  = pOrderBy;.  is
1ea30 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  Agg = (p->selFla
1ea40 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
1ea50 65 29 21 3d 30 3b 0a 20 20 69 66 28 20 70 45 4c  e)!=0;.  if( pEL
1ea60 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ist==0 ) goto se
1ea70 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
1ea80 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65  .  ** Do not eve
1ea90 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 6e  n attempt to gen
1eaa0 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20 69  erate any code i
1eab0 66 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64  f we have alread
1eac0 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f  y seen.  ** erro
1ead0 72 73 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  rs before this r
1eae0 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a 20  outine starts.. 
1eaf0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
1eb00 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f 20  ->nErr>0 ) goto 
1eb10 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
1eb20 2a 20 4f 52 44 45 52 20 42 59 20 69 73 20 69 67  * ORDER BY is ig
1eb30 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64  nored for some d
1eb40 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a  estinations..  *
1eb50 2f 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  /.  if( Ignorabl
1eb60 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
1eb70 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20  ){.    pOrderBy 
1eb80 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  = 0;.  }..  /* B
1eb90 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
1eba0 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  code..  */.  v =
1ebb0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1ebc0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
1ebd0 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
1ebe0 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 47 65 6e  t_end;..  /* Gen
1ebf0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
1ec00 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69  ll sub-queries i
1ec10 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1ec20 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  e.  */.#if !defi
1ec30 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1ec40 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
1ec50 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1ec60 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d  T_VIEW).  for(i=
1ec70 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26  0; !p->pPrior &&
1ec80 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1ec90 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
1eca0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1ecb0 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
1ecc0 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53  ist->a[i];.    S
1ecd0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
1ece0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
1ecf0 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63   = pItem->pSelec
1ed00 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 41 67 67  t;.    int isAgg
1ed10 53 75 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 53  Sub;..    if( pS
1ed20 75 62 3d 3d 30 20 7c 7c 20 70 49 74 65 6d 2d 3e  ub==0 || pItem->
1ed30 69 73 50 6f 70 75 6c 61 74 65 64 20 29 20 63 6f  isPopulated ) co
1ed40 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20  ntinue;..    /* 
1ed50 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e  Increment Parse.
1ed60 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68  nHeight by the h
1ed70 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72  eight of the lar
1ed80 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a  gest expression.
1ed90 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65      ** tree refe
1eda0 72 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20  red to by this, 
1edb0 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63  the parent selec
1edc0 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c  t. The child sel
1edd0 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63  ect.    ** may c
1ede0 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f  ontain expressio
1edf0 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f  n trees of at mo
1ee00 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54  st.    ** (SQLIT
1ee10 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
1ee20 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20  -Parse.nHeight) 
1ee30 68 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20  height. This is 
1ee40 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72  a bit.    ** mor
1ee50 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74  e conservative t
1ee60 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62  han necessary, b
1ee70 75 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74  ut much easier t
1ee80 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20  han enforcing.  
1ee90 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69    ** an exact li
1eea0 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mit..    */.    
1eeb0 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
1eec0 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  += sqlite3Select
1eed0 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a  ExprHeight(p);..
1eee0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
1eef0 73 65 65 20 69 66 20 74 68 65 20 73 75 62 71 75  see if the subqu
1ef00 65 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72  ery can be absor
1ef10 62 65 64 20 69 6e 74 6f 20 74 68 65 20 70 61 72  bed into the par
1ef20 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 73 41 67  ent. */.    isAg
1ef30 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73 65  gSub = (pSub->se
1ef40 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
1ef50 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20 69  egate)!=0;.    i
1ef60 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  f( flattenSubque
1ef70 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c  ry(pParse, p, i,
1ef80 20 69 73 41 67 67 2c 20 69 73 41 67 67 53 75 62   isAgg, isAggSub
1ef90 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ) ){.      if( i
1efa0 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20  sAggSub ){.     
1efb0 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20     isAgg = 1;.  
1efc0 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67        p->selFlag
1efd0 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74  s |= SF_Aggregat
1efe0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
1eff0 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c   i = -1;.    }el
1f000 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1f010 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
1f020 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d  &dest, SRT_Ephem
1f030 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Tab, pItem->iCur
1f040 73 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  sor);.      asse
1f050 72 74 28 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70  rt( pItem->isPop
1f060 75 6c 61 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20  ulated==0 );.   
1f070 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
1f080 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26  (pParse, pSub, &
1f090 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74  dest);.      pIt
1f0a0 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20  em->isPopulated 
1f0b0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
1f0c0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1f0d0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1f0e0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  led ){.      got
1f0f0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1f100 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
1f110 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74  nHeight -= sqlit
1f120 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
1f130 68 74 28 70 29 3b 0a 20 20 20 20 70 54 61 62 4c  ht(p);.    pTabL
1f140 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
1f150 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c     if( !Ignorabl
1f160 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
1f170 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  ){.      pOrderB
1f180 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
1f190 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c  .    }.  }.  pEL
1f1a0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
1f1b0 0a 23 65 6e 64 69 66 0a 20 20 70 57 68 65 72 65  .#endif.  pWhere
1f1c0 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
1f1d0 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
1f1e0 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
1f1f0 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
1f200 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 28    isDistinct = (
1f210 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1f220 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a  _Distinct)!=0;..
1f230 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f240 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
1f250 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  ECT.  /* If ther
1f260 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65  e is are a seque
1f270 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20  nce of queries, 
1f280 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f  do the earlier o
1f290 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a  nes first..  */.
1f2a0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
1f2b0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52  ){.    if( p->pR
1f2c0 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20  ightmost==0 ){. 
1f2d0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f       Select *pLo
1f2e0 6f 70 2c 20 2a 70 52 69 67 68 74 20 3d 20 30 3b  op, *pRight = 0;
1f2f0 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
1f300 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78   0;.      int mx
1f310 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 66 6f  Select;.      fo
1f320 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
1f330 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
1f340 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20  Prior, cnt++){. 
1f350 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52         pLoop->pR
1f360 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20  ightmost = p;.  
1f370 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65        pLoop->pNe
1f380 78 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  xt = pRight;.   
1f390 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
1f3a0 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oop;.      }.   
1f3b0 20 20 20 6d 78 53 65 6c 65 63 74 20 3d 20 64 62     mxSelect = db
1f3c0 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
1f3d0 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
1f3e0 45 4c 45 43 54 5d 3b 0a 20 20 20 20 20 20 69 66  ELECT];.      if
1f3f0 28 20 6d 78 53 65 6c 65 63 74 20 26 26 20 63 6e  ( mxSelect && cn
1f400 74 3e 6d 78 53 65 6c 65 63 74 20 29 7b 0a 20 20  t>mxSelect ){.  
1f410 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1f420 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
1f430 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e  oo many terms in
1f440 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1f450 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
1f460 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
1f470 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6d    }.    return m
1f480 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
1f490 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
1f4a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
1f4b0 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d  f writing to mem
1f4c0 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e  ory or generatin
1f4d0 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c  g a set.  ** onl
1f4e0 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  y a single colum
1f4f0 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e  n may be output.
1f500 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
1f510 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1f520 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f  RY.  if( checkFo
1f530 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65  rMultiColumnSele
1f540 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
1f550 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e  pDest, pEList->n
1f560 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74  Expr) ){.    got
1f570 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1f580 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
1f590 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 77 72  f possible, rewr
1f5a0 69 74 65 20 74 68 65 20 71 75 65 72 79 20 74 6f  ite the query to
1f5b0 20 75 73 65 20 47 52 4f 55 50 20 42 59 20 69 6e   use GROUP BY in
1f5c0 73 74 65 61 64 20 6f 66 20 44 49 53 54 49 4e 43  stead of DISTINC
1f5d0 54 2e 0a 20 20 2a 2a 20 47 52 4f 55 50 20 42 59  T..  ** GROUP BY
1f5e0 20 6d 69 67 68 74 20 75 73 65 20 61 6e 20 69 6e   might use an in
1f5f0 64 65 78 2c 20 44 49 53 54 49 4e 43 54 20 6e 65  dex, DISTINCT ne
1f600 76 65 72 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20  ver does..  */. 
1f610 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
1f620 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
1f630 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
1f640 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 26 26 20  =SF_Distinct && 
1f650 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a  !p->pGroupBy ){.
1f660 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20      p->pGroupBy 
1f670 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1f680 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
1f690 73 74 2c 20 30 29 3b 0a 20 20 20 20 70 47 72 6f  st, 0);.    pGro
1f6a0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
1f6b0 42 79 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c  By;.    p->selFl
1f6c0 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
1f6d0 6e 63 74 3b 0a 20 20 20 20 69 73 44 69 73 74 69  nct;.    isDisti
1f6e0 6e 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  nct = 0;.  }..  
1f6f0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
1f700 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1f710 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72  e, then this sor
1f720 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
1f730 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69  might end up bei
1f740 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65  ng unused if the
1f750 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20   data can be .  
1f760 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e 20  ** extracted in 
1f770 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72  pre-sorted order
1f780 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
1f790 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
1f7a0 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68  .  ** OP_OpenEph
1f7b0 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
1f7c0 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  on will be chang
1f7d0 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70  ed to an OP_Noop
1f7e0 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69   once.  ** we fi
1f7f0 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68  gure out that th
1f800 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
1f810 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20  is not needed.  
1f820 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65  The addrSortInde
1f830 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20  x.  ** variable 
1f840 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c  is used to facil
1f850 69 74 61 74 65 20 74 68 61 74 20 63 68 61 6e 67  itate that chang
1f860 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  e..  */.  if( pO
1f870 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
1f880 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
1f890 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
1f8a0 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
1f8b0 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ist(pParse, pOrd
1f8c0 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65  erBy);.    pOrde
1f8d0 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  rBy->iECursor = 
1f8e0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
1f8f0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
1f900 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72  phm[2] = addrSor
1f910 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73  tIndex =.      s
1f920 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1f930 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
1f940 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
1f950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f960 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
1f970 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  sor, pOrderBy->n
1f980 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20  Expr+2, 0,.     
1f990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9a0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
1f9b0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
1f9c0 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65  O_HANDOFF);.  }e
1f9d0 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72  lse{.    addrSor
1f9e0 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d  tIndex = -1;.  }
1f9f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
1fa00 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
1fa10 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
1fa20 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
1fa30 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
1fa40 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
1fa50 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
1fa60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1fa70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
1fa80 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65  enEphemeral, pDe
1fa90 73 74 2d 3e 69 50 61 72 6d 2c 20 70 45 4c 69 73  st->iParm, pELis
1faa0 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a  t->nExpr);.  }..
1fab0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d    /* Set the lim
1fac0 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e  iter..  */.  iEn
1fad0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
1fae0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63  akeLabel(v);.  c
1faf0 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
1fb00 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
1fb10 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  iEnd);..  /* Ope
1fb20 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  n a virtual inde
1fb30 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
1fb40 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
1fb50 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74   */.  if( isDist
1fb60 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49  inct ){.    KeyI
1fb70 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
1fb80 20 20 20 61 73 73 65 72 74 28 20 69 73 41 67 67     assert( isAgg
1fb90 20 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 3b 0a   || pGroupBy );.
1fba0 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70      distinct = p
1fbb0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
1fbc0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
1fbd0 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
1fbe0 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  t(pParse, p->pEL
1fbf0 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
1fc00 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1fc10 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
1fc20 20 64 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c   distinct, 0, 0,
1fc30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fc40 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
1fc50 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
1fc60 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
1fc70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74   }else{.    dist
1fc80 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  inct = -1;.  }..
1fc90 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 61    /* Aggregate a
1fca0 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  nd non-aggregate
1fcb0 20 71 75 65 72 69 65 73 20 61 72 65 20 68 61 6e   queries are han
1fcc0 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
1fcd0 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67   */.  if( !isAgg
1fce0 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20   && pGroupBy==0 
1fcf0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
1fd00 61 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61  ase is for non-a
1fd10 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
1fd20 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 74 68  .    ** Begin th
1fd30 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a  e database scan.
1fd40 20 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66      */.    pWInf
1fd50 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
1fd60 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
1fd70 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
1fd80 26 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 30 29  &pOrderBy, 0, 0)
1fd90 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
1fda0 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
1fdb0 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 49  t_end;..    /* I
1fdc0 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  f sorting index 
1fdd0 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64  that was created
1fde0 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f   by a prior OP_O
1fdf0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20  penEphemeral .  
1fe00 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
1fe10 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65   ended up not be
1fe20 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e  ing needed, then
1fe30 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f   change the OP_O
1fe40 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20  penEphemeral.   
1fe50 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e   ** into an OP_N
1fe60 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
1fe70 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64 65  if( addrSortInde
1fe80 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79  x>=0 && pOrderBy
1fe90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
1fea0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
1feb0 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  Noop(v, addrSort
1fec0 49 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20 20 20  Index, 1);.     
1fed0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
1fee0 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  [2] = -1;.    }.
1fef0 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
1ff00 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c  standard inner l
1ff10 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  oop.    */.    a
1ff20 73 73 65 72 74 28 21 69 73 44 69 73 74 69 6e 63  ssert(!isDistinc
1ff30 74 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 49 6e  t);.    selectIn
1ff40 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
1ff50 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p, pEList, 0, 0,
1ff60 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 70   pOrderBy, -1, p
1ff70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
1ff80 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
1ff90 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49  ->iContinue, pWI
1ffa0 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20  nfo->iBreak);.. 
1ffb0 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61     /* End the da
1ffc0 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70  tabase scan loop
1ffd0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
1ffe0 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
1fff0 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nfo);.  }else{. 
20000 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
20010 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  e processing for
20020 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
20030 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f  es */.    NameCo
20040 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a  ntext sNC;    /*
20050 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
20060 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67  r processing agg
20070 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69  regate informati
20080 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  on */.    int iA
20090 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
200a0 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
200b0 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63  ss for storing c
200c0 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
200d0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d  */.    int iBMem
200e0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
200f0 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
20100 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f  for previous GRO
20110 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
20120 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20   iUseFlag;      
20130 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
20140 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64  holding flag ind
20150 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20  icating that at 
20160 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20  least.          
20170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
20180 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
20190 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67  input to the agg
201a0 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e  regator has been
201b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
201c0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
201d0 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  essed */.    int
201e0 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20   iAbortFlag;    
201f0 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
20200 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65  which causes que
20210 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69  ry abort if posi
20220 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tive */.    int 
20230 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20  groupBySort;    
20240 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f  /* Rows come fro
20250 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55  m source in GROU
20260 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20  P BY order */.  
20270 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20    int addrEnd;  
20280 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
20290 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74  processing for t
202a0 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 0a 20  his SELECT */.. 
202b0 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79     /* Remove any
202c0 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73   and all aliases
202d0 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73   between the res
202e0 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a  ult set and the.
202f0 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20      ** GROUP BY 
20300 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  clause..    */. 
20310 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
20320 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20  ){.      int k; 
20330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20340 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
20350 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
20360 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
20370 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a  item *pItem;  /*
20380 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
20390 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  r expression in 
203a0 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20  a list */..     
203b0 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74   for(k=p->pEList
203c0 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
203d0 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30  ->pEList->a; k>0
203e0 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
203f0 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
20400 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
20410 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d    }.      for(k=
20420 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
20430 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d   pItem=pGroupBy-
20440 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
20450 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
20460 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20  pItem->iAlias = 
20470 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
20480 0a 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  .. .    /* Creat
20490 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d  e a label to jum
204a0 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e  p to when we wan
204b0 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71  t to abort the q
204c0 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72  uery */.    addr
204d0 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
204e0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
204f0 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54      /* Convert T
20500 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69  K_COLUMN nodes i
20510 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  nto TK_AGG_COLUM
20520 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69  N and make entri
20530 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67  es in.    ** sAg
20540 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b  gInfo for all TK
20550 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f  _AGG_FUNCTION no
20560 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  des in expressio
20570 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ns of the.    **
20580 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
20590 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65  t..    */.    me
205a0 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
205b0 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
205c0 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
205d0 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  rse;.    sNC.pSr
205e0 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
205f0 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e  ;.    sNC.pAggIn
20600 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a  fo = &sAggInfo;.
20610 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f      sAggInfo.nSo
20620 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47  rtingColumn = pG
20630 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42  roupBy ? pGroupB
20640 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a  y->nExpr+1 : 0;.
20650 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72      sAggInfo.pGr
20660 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
20670 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
20680 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
20690 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20  &sNC, pEList);. 
206a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
206b0 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
206c0 43 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  C, pOrderBy);.  
206d0 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b    if( pHaving ){
206e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
206f0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
20700 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e  tes(&sNC, pHavin
20710 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41  g);.    }.    sA
20720 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61  ggInfo.nAccumula
20730 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e  tor = sAggInfo.n
20740 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28  Column;.    for(
20750 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
20760 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFunc; i++){.   
20770 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
20780 48 61 73 50 72 6f 70 65 72 74 79 28 73 41 67 67  HasProperty(sAgg
20790 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45  Info.aFunc[i].pE
207a0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
207b0 74 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t) );.      sqli
207c0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
207d0 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67  gList(&sNC, sAgg
207e0 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45  Info.aFunc[i].pE
207f0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
20800 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
20810 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
20820 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
20830 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73  ..    /* Process
20840 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
20850 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59  es with GROUP BY
20860 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65   is very differe
20870 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75  nt and.    ** mu
20880 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20  ch more complex 
20890 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20  than aggregates 
208a0 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20  without a GROUP 
208b0 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  BY..    */.    i
208c0 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
208d0 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
208e0 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69  eyInfo;  /* Keyi
208f0 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
20900 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20  or the group by 
20910 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
20920 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20  int j1;         
20930 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f      /* A-vs-B co
20940 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a  mparision jump *
20950 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
20960 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53  OutputRow;  /* S
20970 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69  tart of subrouti
20980 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
20990 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a  a result row */.
209a0 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74        int regOut
209b0 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74  putRow;   /* Ret
209c0 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
209d0 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20  ster for output 
209e0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
209f0 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41      int addrSetA
20a00 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74  bort;   /* Set t
20a10 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e  he abort flag an
20a20 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20  d return */.    
20a30 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c    int addrTopOfL
20a40 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20  oop;  /* Top of 
20a50 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a  the input loop *
20a60 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
20a70 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54  SortingIdx; /* T
20a80 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
20a90 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74  ral for the sort
20aa0 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ing index */.   
20ab0 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74     int addrReset
20ac0 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75  ;      /* Subrou
20ad0 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69  tine for resetti
20ae0 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ng the accumulat
20af0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  or */.      int 
20b00 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20 20  regReset;       
20b10 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
20b20 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72  s register for r
20b30 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20  eset subroutine 
20b40 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  */..      /* If 
20b50 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50  there is a GROUP
20b60 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69   BY clause we mi
20b70 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69  ght need a sorti
20b80 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20  ng index to.    
20b90 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69    ** implement i
20ba0 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61  t.  Allocate tha
20bb0 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  t sorting index 
20bc0 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e  now.  If it turn
20bd0 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  s out.      ** t
20be0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  hat we do not ne
20bf0 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c  ed it after all,
20c00 20 74 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72   the OpenEphemer
20c10 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20  al instruction. 
20c20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20       ** will be 
20c30 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
20c40 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a   Noop.  .      *
20c50 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f  /.      sAggInfo
20c60 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50  .sortingIdx = pP
20c70 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
20c80 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
20c90 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
20ca0 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
20cb0 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72  pBy);.      addr
20cc0 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c  SortingIdx = sql
20cd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
20ce0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
20cf0 61 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  al, .          s
20d00 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
20d10 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f  dx, sAggInfo.nSo
20d20 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20  rtingColumn, .  
20d30 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61 72          0, (char
20d40 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
20d50 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
20d60 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69  ..      /* Initi
20d70 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63  alize memory loc
20d80 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47  ations used by G
20d90 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74  ROUP BY aggregat
20da0 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20  e processing.   
20db0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65     */.      iUse
20dc0 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
20dd0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62  >nMem;.      iAb
20de0 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  ortFlag = ++pPar
20df0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
20e00 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b  regOutputRow = +
20e10 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
20e20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
20e30 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
20e40 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
20e50 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b      regReset = +
20e60 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
20e70 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d       addrReset =
20e80 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
20e90 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
20ea0 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iAMem = pParse->
20eb0 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
20ec0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
20ed0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
20ee0 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70  .      iBMem = p
20ef0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
20f00 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
20f10 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
20f20 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >nExpr;.      sq
20f30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20f40 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
20f50 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
20f60 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
20f70 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72  ((v, "clear abor
20f80 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
20f90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20fa0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
20fb0 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 0, iUseFlag);.
20fc0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
20fd0 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
20fe0 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74  accumulator empt
20ff0 79 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  y"));..      /* 
21000 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61  Begin a loop tha
21010 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61  t will extract a
21020 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69  ll source rows i
21030 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
21040 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
21050 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77  might involve tw
21060 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73  o separate loops
21070 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74   with an OP_Sort
21080 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a   in between, or.
21090 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
210a0 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f  t be a single lo
210b0 6f 70 20 74 68 61 74 20 75 73 65 73 20 61 6e 20  op that uses an 
210c0 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63 74  index to extract
210d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20   information.   
210e0 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67     ** in the rig
210f0 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69  ht order to begi
21100 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f  n with..      */
21110 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21120 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
21130 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
21140 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
21150 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
21160 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
21170 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
21180 57 68 65 72 65 2c 20 26 70 47 72 6f 75 70 42 79  Where, &pGroupBy
21190 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
211a0 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
211b0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
211c0 20 20 20 20 20 20 69 66 28 20 70 47 72 6f 75 70        if( pGroup
211d0 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  By==0 ){.       
211e0 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65   /* The optimize
211f0 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c  r is able to del
21200 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f  iver rows in gro
21210 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20  up by order so. 
21220 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20         ** we do 
21230 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74  not have to sort
21240 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  .  The OP_OpenEp
21250 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
21260 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
21270 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72   cancelled later
21280 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c   because we stil
21290 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68  l need to use th
212a0 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20  e pKeyInfo.     
212b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 47     */.        pG
212c0 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
212d0 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 67 72  upBy;.        gr
212e0 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20  oupBySort = 0;. 
212f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21300 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20      /* Rows are 
21310 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e  coming out in un
21320 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72  determined order
21330 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75  .  We have to pu
21340 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61  sh.        ** ea
21350 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f  ch row into a so
21360 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72  rting index, ter
21370 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74  minate the first
21380 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a   loop,.        *
21390 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72  * then loop over
213a0 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
213b0 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ex in order to g
213c0 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  et the output.  
213d0 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74        ** in sort
213e0 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  ed order.       
213f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
21400 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
21410 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a   int regRecord;.
21420 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
21430 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47  ;.        int nG
21440 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20  roupBy;..       
21450 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31   groupBySort = 1
21460 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70  ;.        nGroup
21470 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  By = pGroupBy->n
21480 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43  Expr;.        nC
21490 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20  ol = nGroupBy + 
214a0 31 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  1;.        j = n
214b0 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20  GroupBy+1;.     
214c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
214d0 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
214e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
214f0 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f  if( sAggInfo.aCo
21500 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75  l[i].iSorterColu
21510 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  mn>=j ){.       
21520 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20       nCol++;.   
21530 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
21540 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21550 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42    }.        regB
21560 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ase = sqlite3Get
21570 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
21580 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
21590 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
215a0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
215b0 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61   pGroupBy, regBa
215c0 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  se, 0);.        
215d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
215e0 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
215f0 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
21600 6e 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e 47  ngIdx,regBase+nG
21610 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20  roupBy);.       
21620 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b   j = nGroupBy+1;
21630 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
21640 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  ; i<sAggInfo.nCo
21650 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
21660 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
21670 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
21680 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b   &sAggInfo.aCol[
21690 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
216a0 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
216b0 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
216c0 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
216d0 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20   j + regBase;.  
216e0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32            int r2
216f0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ;..            r
21700 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
21710 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
21720 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
21730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21740 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c       pCol->pTab,
21750 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20   pCol->iColumn, 
21760 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31  pCol->iTable, r1
21770 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
21780 20 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a    if( r1!=r2 ){.
21790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
217a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
217b0 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c  v, OP_SCopy, r2,
217c0 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
217d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
217e0 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
217f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21800 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73     regRecord = s
21810 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
21820 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
21830 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21840 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
21850 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e  cord, regBase, n
21860 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Col, regRecord);
21870 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21880 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21890 5f 49 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67  _IdxInsert, sAgg
218a0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
218b0 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
218c0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
218d0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
218e0 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
218f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
21900 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
21910 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
21920 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
21930 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
21940 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
21950 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21960 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41  2(v, OP_Sort, sA
21970 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
21980 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  x, addrEnd);.   
21990 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
219a0 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73  ((v, "GROUP BY s
219b0 6f 72 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20  ort"));.        
219c0 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74  sAggInfo.useSort
219d0 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20  ingIdx = 1;.    
219e0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76    }..      /* Ev
219f0 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65  aluate the curre
21a00 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
21a10 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62  s and store in b
21a20 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20  0, b1, b2....   
21a30 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d     ** (b0 is mem
21a40 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d  ory location iBM
21a50 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65  em+0, b1 is iBMe
21a60 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  m+1, and so fort
21a70 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  h).      ** Then
21a80 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72   compare the cur
21a90 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
21aa0 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  rms against the 
21ab0 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20  GROUP BY terms. 
21ac0 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
21ad0 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75   previous row cu
21ae0 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
21af0 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a  n a0, a1, a2....
21b00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
21b10 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73  ddrTopOfLoop = s
21b20 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
21b30 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
21b40 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75  for(j=0; j<pGrou
21b50 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  pBy->nExpr; j++)
21b60 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72  {.        if( gr
21b70 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
21b80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21b90 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
21ba0 6f 6c 75 6d 6e 2c 20 73 41 67 67 49 6e 66 6f 2e  olumn, sAggInfo.
21bb0 73 6f 72 74 69 6e 67 49 64 78 2c 20 6a 2c 20 69  sortingIdx, j, i
21bc0 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
21bd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21be0 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63    sAggInfo.direc
21bf0 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  tMode = 1;.     
21c00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21c10 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72  Code(pParse, pGr
21c20 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70  oupBy->a[j].pExp
21c30 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  r, iBMem+j);.   
21c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
21c50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21c60 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
21c70 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d  pare, iAMem, iBM
21c80 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
21c90 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
21cb0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
21cc0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
21cd0 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
21ce0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
21cf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21d00 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
21d10 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c 20  _Jump, j1+1, 0, 
21d20 6a 31 2b 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  j1+1);..      /*
21d30 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
21d40 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65  hat runs wheneve
21d50 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  r the GROUP BY c
21d60 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a  hanges..      **
21d70 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20   Changes in the 
21d80 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74  GROUP BY are det
21d90 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65  ected by the pre
21da0 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20  vious code.     
21db0 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74   ** block.  If t
21dc0 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61  here were no cha
21dd0 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b  nges, this block
21de0 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   is skipped..   
21df0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
21e00 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20  his code copies 
21e10 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79  current group by
21e20 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c   terms in b0,b1,
21e30 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  b2,....      ** 
21e40 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32  over to a0,a1,a2
21e50 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73  .  It then calls
21e60 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
21e70 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
21e80 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61  and resets the a
21e90 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
21ea0 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69  ator registers i
21eb0 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20  n preparation.  
21ec0 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e      ** for the n
21ed0 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74  ext GROUP BY bat
21ee0 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
21ef0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
21f00 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  deMove(pParse, i
21f10 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72  BMem, iAMem, pGr
21f20 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20  oupBy->nExpr);. 
21f30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21f40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
21f50 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  ub, regOutputRow
21f60 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
21f70 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
21f80 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20  ent((v, "output 
21f90 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20  one row"));.    
21fa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21fb0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
21fc0 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64   iAbortFlag, add
21fd0 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62  rEnd);.      Vdb
21fe0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68  eComment((v, "ch
21ff0 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29  eck abort flag")
22000 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22010 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22020 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
22030 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
22040 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
22050 28 76 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d  (v, "reset accum
22060 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  ulator"));..    
22070 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
22080 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
22090 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20  lators based on 
220a0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20  the content of. 
220b0 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72       ** the curr
220c0 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f  ent row.      */
220d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
220e0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
220f0 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41  );.      updateA
22100 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
22110 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
22120 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22130 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
22140 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61  eger, 1, iUseFla
22150 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
22160 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63  mment((v, "indic
22170 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63 75  ate data in accu
22180 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
22190 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65     /* End of the
221a0 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20   loop.      */. 
221b0 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
221c0 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
221d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
221e0 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 73 41  2(v, OP_Next, sA
221f0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
22200 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70  x, addrTopOfLoop
22210 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
22220 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
22230 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
22240 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22250 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
22260 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49  (v, addrSortingI
22270 64 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  dx, 1);.      }.
22280 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  .      /* Output
22290 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f   the final row o
222a0 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  f result.      *
222b0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
222c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
222d0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74  Gosub, regOutput
222e0 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52  Row, addrOutputR
222f0 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
22300 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
22310 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b  ut final row"));
22320 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  ..      /* Jump 
22330 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f 75 74  over the subrout
22340 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ines.      */.  
22350 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22360 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
22370 2c 20 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a  , 0, addrEnd);..
22380 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
22390 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
223a0 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69  hat outputs a si
223b0 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
223c0 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
223d0 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f  set.  This subro
223e0 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b  utine first look
223f0 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61  s at the iUseFla
22400 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a  g.  If iUseFlag.
22410 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73        ** is less
22420 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
22430 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72  o zero, the subr
22440 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
22450 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20  p.  If.      ** 
22460 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63  the processing c
22470 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65  alls for the que
22480 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69  ry to abort, thi
22490 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  s subroutine.   
224a0 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73     ** increments
224b0 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20   the iAbortFlag 
224c0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
224d0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
224e0 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64   in.      ** ord
224f0 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65  er to signal the
22500 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74   caller to abort
22510 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
22520 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20   addrSetAbort = 
22530 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
22540 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
22550 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22560 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
22570 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29  , 1, iAbortFlag)
22580 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
22590 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f  ent((v, "set abo
225a0 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
225b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
225c0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
225d0 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
225e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
225f0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
22600 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
22610 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70  ;.      addrOutp
22620 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  utRow = sqlite3V
22630 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
22640 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22650 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22660 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67  _IfPos, iUseFlag
22670 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
22680 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  2);.      VdbeCo
22690 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70  mment((v, "Group
226a0 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
226b0 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22  tor entry point"
226c0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
226d0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
226e0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
226f0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66  putRow);.      f
22700 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
22710 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
22720 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  gInfo);.      if
22730 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
22740 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
22750 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
22760 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74  pHaving, addrOut
22770 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45  putRow+1, SQLITE
22780 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
22790 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65      }.      sele
227a0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
227b0 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
227c0 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
227d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
227e0 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74          distinct
227f0 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
22800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
22810 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20  ddrOutputRow+1, 
22820 61 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20  addrSetAbort);. 
22830 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22840 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
22850 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
22860 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
22870 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67  mment((v, "end g
22880 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65  roupby result ge
22890 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  nerator"));..   
228a0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
228b0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
228c0 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20   will reset the 
228d0 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c  group-by accumul
228e0 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ator.      */.  
228f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
22900 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
22910 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
22920 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
22930 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
22940 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
22950 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
22960 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52   OP_Return, regR
22970 65 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20  eset);.     .   
22980 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f   } /* endif pGro
22990 75 70 42 79 20 2a 2f 0a 20 20 20 20 65 6c 73 65  upBy */.    else
229a0 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
229b0 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66  t *pDel = 0;.#if
229c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
229d0 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20  _BTREECOUNT.    
229e0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
229f0 20 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d       if( (pTab =
22a00 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70   isSimpleCount(p
22a10 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30  , &sAggInfo))!=0
22a20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
22a30 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28  f isSimpleCount(
22a40 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  ) returns a poin
22a50 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73  ter to a Table s
22a60 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20  tructure, then. 
22a70 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51         ** the SQ
22a80 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  L statement is o
22a90 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20  f the form:.    
22aa0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
22ab0 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  *   SELECT count
22ac0 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20  (*) FROM <tbl>. 
22ad0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
22ae0 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54    ** where the T
22af0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 72  able structure r
22b00 65 74 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e  eturned represen
22b10 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a  ts table <tbl>..
22b20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
22b30 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65     ** This state
22b40 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f  ment is so commo
22b50 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f 70 74  n that it is opt
22b60 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79  imized specially
22b70 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
22b80 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75   OP_Count instru
22b90 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65  ction is execute
22ba0 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20  d either on the 
22bb0 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61  intkey table tha
22bc0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
22bd0 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 20 66  tains the data f
22be0 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f  or table <tbl> o
22bf0 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20  r on one of its 
22c00 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20  indexes. It.    
22c10 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72      ** is better
22c20 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
22c30 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20  op on an index, 
22c40 61 73 20 69 6e 64 65 78 65 73 20 61 72 65 20 61  as indexes are a
22c50 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  lmost.        **
22c60 20 61 6c 77 61 79 73 20 73 70 72 65 61 64 20 61   always spread a
22c70 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73  cross less pages
22c80 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72   than their corr
22c90 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73  esponding tables
22ca0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
22cb0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
22cc0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
22cd0 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
22ce0 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
22cf0 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ema);.        co
22d00 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70  nst int iCsr = p
22d10 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
22d20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
22d30 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20  scan b-tree */. 
22d40 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49         Index *pI
22d50 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
22d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
22d70 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
22d80 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49   */.        KeyI
22d90 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
22da0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
22db0 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20   /* Keyinfo for 
22dc0 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f  scanned index */
22dd0 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
22de0 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pBest = 0;      
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22e00 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e   Best index foun
22e10 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  d so far */.    
22e20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20      int iRoot = 
22e30 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20  pTab->tnum;     
22e40 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
22e50 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64   page of scanned
22e60 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20   b-tree */..    
22e70 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
22e80 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
22e90 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
22ea0 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
22eb0 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
22ec0 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
22ed0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
22ee0 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
22ef0 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74 68  for the index th
22f00 61 74 20 68 61 73 20 74 68 65 20 6c 65 61 73 74  at has the least
22f10 20 61 6d 6f 75 6e 74 20 6f 66 20 63 6f 6c 75 6d   amount of colum
22f20 6e 73 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a  ns. If.        *
22f30 2a 20 74 68 65 72 65 20 69 73 20 73 75 63 68 20  * there is such 
22f40 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 74  an index, and it
22f50 20 68 61 73 20 6c 65 73 73 20 63 6f 6c 75 6d 6e   has less column
22f60 73 20 74 68 61 6e 20 74 68 65 20 74 61 62 6c 65  s than the table
22f70 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
22f80 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 61 73  , then we can as
22f90 73 75 6d 65 20 74 68 61 74 20 69 74 20 63 6f 6e  sume that it con
22fa0 73 75 6d 65 73 20 6c 65 73 73 20 73 70 61 63 65  sumes less space
22fb0 20 6f 6e 20 64 69 73 6b 20 61 6e 64 0a 20 20 20   on disk and.   
22fc0 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 74 68 65       ** will the
22fd0 72 65 66 6f 72 65 20 62 65 20 63 68 65 61 70 65  refore be cheape
22fe0 72 20 74 6f 20 73 63 61 6e 20 74 6f 20 64 65 74  r to scan to det
22ff0 65 72 6d 69 6e 65 20 74 68 65 20 71 75 65 72 79  ermine the query
23000 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20   result..       
23010 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
23020 20 73 65 74 20 69 52 6f 6f 74 20 74 6f 20 74 68   set iRoot to th
23030 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
23040 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  er of the index 
23050 62 2d 74 72 65 65 0a 20 20 20 20 20 20 20 20 2a  b-tree.        *
23060 2a 20 61 6e 64 20 70 4b 65 79 49 6e 66 6f 20 74  * and pKeyInfo t
23070 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  o the KeyInfo st
23080 72 75 63 74 75 72 65 20 72 65 71 75 69 72 65 64  ructure required
23090 20 74 6f 20 6e 61 76 69 67 61 74 65 20 74 68 65   to navigate the
230a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
230b0 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
230c0 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63        ** In prac
230d0 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f  tice the KeyInfo
230e0 20 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20   structure will 
230f0 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74 20  not be used. It 
23100 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20  is only .       
23110 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65   ** passed to ke
23120 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68  ep OP_OpenRead h
23130 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  appy..        */
23140 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64  .        for(pId
23150 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
23160 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
23170 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
23180 20 20 20 69 66 28 20 21 70 42 65 73 74 20 7c 7c     if( !pBest ||
23190 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70   pIdx->nColumn<p
231a0 42 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  Best->nColumn ){
231b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65  .            pBe
231c0 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  st = pIdx;.     
231d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
231e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65  .        if( pBe
231f0 73 74 20 26 26 20 70 42 65 73 74 2d 3e 6e 43 6f  st && pBest->nCo
23200 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  lumn<pTab->nCol 
23210 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f  ){.          iRo
23220 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d  ot = pBest->tnum
23230 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79  ;.          pKey
23240 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e  Info = sqlite3In
23250 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
23260 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  e, pBest);.     
23270 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
23280 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c   Open a read-onl
23290 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74  y cursor, execut
232a0 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20  e the OP_Count, 
232b0 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72  close the cursor
232c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
232d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
232e0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
232f0 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 29  Csr, iRoot, iDb)
23300 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b  ;.        if( pK
23310 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
23320 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
23330 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
23340 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c  char *)pKeyInfo,
23350 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
23360 4f 46 46 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OFF);.        }.
23370 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23380 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
23390 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67  Count, iCsr, sAg
233a0 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69  gInfo.aFunc[0].i
233b0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
233c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
233d0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73  v, OP_Close, iCs
233e0 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  r);.      }else.
233f0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
23400 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
23410 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   */.      {.    
23420 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
23430 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20  the query is of 
23440 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
23450 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20  wing forms:.    
23460 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
23470 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78  *   SELECT min(x
23480 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
23490 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d     **   SELECT m
234a0 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20  ax(x) FROM .... 
234b0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
234c0 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74    ** If it is, t
234d0 68 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65  hen ask the code
234e0 20 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61   in where.c to a
234f0 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72  ttempt to sort r
23500 65 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a  esults.        *
23510 2a 20 61 73 20 69 66 20 74 68 65 72 65 20 77 61  * as if there wa
23520 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78  s an "ORDER ON x
23530 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78  " or "ORDER ON x
23540 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a   DESC" clause. .
23550 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68          ** If wh
23560 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f  ere.c is able to
23570 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73   produce results
23580 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20   sorted in this 
23590 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20  order, then.    
235a0 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20      ** add vdbe 
235b0 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  code to break ou
235c0 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73  t of the process
235d0 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74  ing loop after t
235e0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  he .        ** f
235f0 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28  irst iteration (
23600 73 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  since the first 
23610 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
23620 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20   loop is .      
23630 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
23640 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
23650 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d  e row with the m
23660 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75  inimum or maximu
23670 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  m .        ** va
23680 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e  lue of x, the on
23690 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29  ly row required)
236a0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
236b0 20 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61       ** A specia
236c0 6c 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70  l flag must be p
236d0 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
236e0 57 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20  WhereBegin() to 
236f0 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20  slightly.       
23700 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76   ** modify behav
23710 69 6f 75 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  iour as follows:
23720 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
23730 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68      **   + If th
23740 65 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45  e query is a "SE
23750 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68  LECT min(x)", th
23760 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65  en the loop code
23770 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  d by.        ** 
23780 20 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75      where.c shou
23790 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f  ld not iterate o
237a0 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77  ver any values w
237b0 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ith a NULL value
237c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
237d0 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a  for x..        *
237e0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b  *.        **   +
237f0 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63   The optimizer c
23800 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28  ode in where.c (
23810 74 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64  the thing that d
23820 65 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20  ecides which.   
23830 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65       **     inde
23840 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20  x or indices to 
23850 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63  use) should plac
23860 65 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72  e a different pr
23870 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20  iority on .     
23880 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66     **     satisf
23890 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20  ying the 'ORDER 
238a0 42 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20  BY' clause than 
238b0 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72  it does in other
238c0 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20   cases..        
238d0 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f 20  **     Refer to 
238e0 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74  code and comment
238f0 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72  s in where.c for
23900 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20   details..      
23910 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70    */.        Exp
23920 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d  rList *pMinMax =
23930 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66   0;.        u8 f
23940 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72  lag = minMaxQuer
23950 79 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  y(p);.        if
23960 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  ( flag ){.      
23970 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
23980 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e  rHasProperty(p->
23990 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
239a0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
239b0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ) );.          p
239c0 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  MinMax = sqlite3
239d0 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
239e0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
239f0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 30  pExpr->x.pList,0
23a00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 65  );.          pDe
23a10 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20  l = pMinMax;.   
23a20 20 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d         if( pMinM
23a30 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  ax && !db->mallo
23a40 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
23a50 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
23a60 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
23a70 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44   flag!=WHERE_ORD
23a80 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20  ERBY_MIN ?1:0;. 
23a90 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d             pMinM
23aa0 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  ax->a[0].pExpr->
23ab0 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
23ac0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23ad0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
23ae0 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75   /* This case ru
23af0 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67  ns if the aggreg
23b00 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50  ate has no GROUP
23b10 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65   BY clause.  The
23b20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  .        ** proc
23b30 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73  essing is much s
23b40 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65  impler since the
23b50 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e  re is only a sin
23b60 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20  gle row.        
23b70 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20  ** of output..  
23b80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
23b90 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
23ba0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
23bb0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57  nfo);.        pW
23bc0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
23bd0 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
23be0 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
23bf0 65 2c 20 26 70 4d 69 6e 4d 61 78 2c 20 66 6c 61  e, &pMinMax, fla
23c00 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  g, 0);.        i
23c10 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a  f( pWInfo==0 ){.
23c20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23c30 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
23c40 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20  db, pDel);.     
23c50 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
23c60 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
23c70 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63          updateAc
23c80 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
23c90 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
23ca0 20 20 20 20 20 20 69 66 28 20 21 70 4d 69 6e 4d        if( !pMinM
23cb0 61 78 20 26 26 20 66 6c 61 67 20 29 7b 0a 20 20  ax && flag ){.  
23cc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23cd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
23ce0 47 6f 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d  Goto, 0, pWInfo-
23cf0 3e 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20  >iBreak);.      
23d00 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
23d10 28 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64  (v, "%s() by ind
23d20 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ex",.           
23d30 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52       (flag==WHER
23d40 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d  E_ORDERBY_MIN?"m
23d50 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20  in":"max")));.  
23d60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23d70 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
23d80 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
23d90 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
23da0 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
23db0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
23dc0 7d 0a 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  }..      pOrderB
23dd0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  y = 0;.      if(
23de0 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
23df0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
23e00 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
23e10 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c  Having, addrEnd,
23e20 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
23e30 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LL);.      }.   
23e40 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
23e50 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
23e60 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30  >pEList, 0, 0, 0
23e70 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20  , -1, .         
23e80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
23e90 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64  st, addrEnd, add
23ea0 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rEnd);.      sql
23eb0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
23ec0 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20  te(db, pDel);.  
23ed0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
23ee0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
23ef0 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  v, addrEnd);.   
23f00 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61   .  } /* endif a
23f10 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
23f20 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  /..  /* If there
23f30 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
23f40 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20  clause, then we 
23f50 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65  need to sort the
23f60 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e   results.  ** an
23f70 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74  d send them to t
23f80 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20  he callback one 
23f90 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  by one..  */.  i
23fa0 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
23fb0 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
23fc0 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76  ail(pParse, p, v
23fd0 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
23fe0 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20   pDest);.  }..  
23ff0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
24000 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a  skip this query.
24010 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
24020 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
24030 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54  , iEnd);..  /* T
24040 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75  he SELECT was su
24050 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64  ccessfully coded
24060 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75  .   Set the retu
24070 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a  rn code to 0.  *
24080 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f  * to indicate no
24090 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20   errors..  */.  
240a0 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  rc = 0;..  /* Co
240b0 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68  ntrol jumps to h
240c0 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ere if an error 
240d0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  is encountered a
240e0 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20  bove, or upon.  
240f0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f  ** successful co
24100 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45  ding of the SELE
24110 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f  CT..  */.select_
24120 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  end:..  /* Ident
24130 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ify column names
24140 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20 74   if results of t
24150 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 74 6f  he SELECT are to
24160 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
24170 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
24180 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65  E_OK && pDest->e
24190 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
241a0 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
241b0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
241c0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
241d0 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  List);.  }..  sq
241e0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
241f0 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a  sAggInfo.aCol);.
24200 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
24210 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  db, sAggInfo.aFu
24220 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nc);.  return rc
24230 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
24240 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
24250 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
24260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
242a0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
242b0 6e 67 20 63 6f 64 65 20 69 73 20 75 73 65 64 20  ng code is used 
242c0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
242d0 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20  debugging only. 
242e0 20 54 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68 61   The code.** tha
242f0 74 20 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20 6e  t follows does n
24300 6f 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72  ot appear in nor
24310 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a  mal builds..**.*
24320 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
24330 20 61 72 65 20 75 73 65 64 20 74 6f 20 70 72 69   are used to pri
24340 6e 74 20 6f 75 74 20 74 68 65 20 63 6f 6e 74 65  nt out the conte
24350 6e 74 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61 72  nt of all or par
24360 74 20 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73 65  t of a .** parse
24370 20 73 74 72 75 63 74 75 72 65 73 20 73 75 63 68   structures such
24380 20 61 73 20 53 65 6c 65 63 74 20 6f 72 20 45 78   as Select or Ex
24390 70 72 2e 20 20 53 75 63 68 20 70 72 69 6e 74 6f  pr.  Such printo
243a0 75 74 73 20 61 72 65 20 75 73 65 66 75 6c 0a 2a  uts are useful.*
243b0 2a 20 66 6f 72 20 68 65 6c 70 69 6e 67 20 74 6f  * for helping to
243c0 20 75 6e 64 65 72 73 74 61 6e 64 20 77 68 61 74   understand what
243d0 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 69 6e   is happening in
243e0 73 69 64 65 20 74 68 65 20 63 6f 64 65 20 67 65  side the code ge
243f0 6e 65 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69 6e  nerator.** durin
24400 67 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20  g the execution 
24410 6f 66 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45 43  of complex SELEC
24420 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  T statements..**
24430 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
24440 65 20 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64  e are not called
24450 20 61 6e 79 77 68 65 72 65 20 66 72 6f 6d 20 77   anywhere from w
24460 69 74 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61 6c  ithin the normal
24470 0a 2a 2a 20 63 6f 64 65 20 62 61 73 65 2e 20 20  .** code base.  
24480 54 68 65 6e 20 61 72 65 20 69 6e 74 65 6e 64 65  Then are intende
24490 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66  d to be called f
244a0 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 64  rom within the d
244b0 65 62 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66 72  ebugger.** or fr
244c0 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20 22 70 72  om temporary "pr
244d0 69 6e 74 66 22 20 73 74 61 74 65 6d 65 6e 74 73  intf" statements
244e0 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20 64 65   inserted for de
244f0 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64  bugging..*/.void
24500 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
24510 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  r(Expr *p){.  if
24520 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20  ( p->token.z && 
24530 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30 20 29 7b 0a  p->token.n>0 ){.
24540 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24550 50 72 69 6e 74 66 28 22 28 25 2e 2a 73 22 2c 20  Printf("(%.*s", 
24560 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e 74  p->token.n, p->t
24570 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65  oken.z);.  }else
24580 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
24590 75 67 50 72 69 6e 74 66 28 22 28 25 64 22 2c 20  ugPrintf("(%d", 
245a0 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20 69 66  p->op);.  }.  if
245b0 28 20 70 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  ( p->pLeft ){.  
245c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
245d0 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73  intf(" ");.    s
245e0 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
245f0 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20  p->pLeft);.  }. 
24600 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29   if( p->pRight )
24610 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
24620 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20  ugPrintf(" ");. 
24630 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
24640 78 70 72 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a  xpr(p->pRight);.
24650 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62    }.  sqlite3Deb
24660 75 67 50 72 69 6e 74 66 28 22 29 22 29 3b 0a 7d  ugPrintf(")");.}
24670 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69  .void sqlite3Pri
24680 6e 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  ntExprList(ExprL
24690 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
246a0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
246b0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
246c0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
246d0 65 33 50 72 69 6e 74 45 78 70 72 28 70 4c 69 73  e3PrintExpr(pLis
246e0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
246f0 20 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d      if( i<pList-
24700 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20  >nExpr-1 ){.    
24710 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24720 69 6e 74 66 28 22 2c 20 22 29 3b 0a 20 20 20 20  intf(", ");.    
24730 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  }.  }.}.void sql
24740 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28  ite3PrintSelect(
24750 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
24760 6e 64 65 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65  ndent){.  sqlite
24770 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
24780 73 53 45 4c 45 43 54 28 25 70 29 20 22 2c 20 69  sSELECT(%p) ", i
24790 6e 64 65 6e 74 2c 20 22 22 2c 20 70 29 3b 0a 20  ndent, "", p);. 
247a0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
247b0 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 29  rList(p->pEList)
247c0 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
247d0 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
247e0 69 66 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20  if( p->pSrc ){. 
247f0 20 20 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78     char *zPrefix
24800 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
24810 20 7a 50 72 65 66 69 78 20 3d 20 22 46 52 4f 4d   zPrefix = "FROM
24820 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ";.    for(i=0; 
24830 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b  i<p->pSrc->nSrc;
24840 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
24850 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
24860 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53   *pItem = &p->pS
24870 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
24880 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24890 74 66 28 22 25 2a 73 20 22 2c 20 69 6e 64 65 6e  tf("%*s ", inden
248a0 74 2b 36 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20  t+6, zPrefix);. 
248b0 20 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22       zPrefix = "
248c0 22 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ";.      if( pIt
248d0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
248e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
248f0 62 75 67 50 72 69 6e 74 66 28 22 28 5c 6e 22 29  bugPrintf("(\n")
24900 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
24910 33 50 72 69 6e 74 53 65 6c 65 63 74 28 70 49 74  3PrintSelect(pIt
24920 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 6e 64  em->pSelect, ind
24930 65 6e 74 2b 31 30 29 3b 0a 20 20 20 20 20 20 20  ent+10);.       
24940 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24950 6e 74 66 28 22 25 2a 73 29 22 2c 20 69 6e 64 65  ntf("%*s)", inde
24960 6e 74 2b 38 2c 20 22 22 29 3b 0a 20 20 20 20 20  nt+8, "");.     
24970 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 6d   }else if( pItem
24980 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ->zName ){.     
24990 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
249a0 72 69 6e 74 66 28 22 25 73 22 2c 20 70 49 74 65  rintf("%s", pIte
249b0 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m->zName);.     
249c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74   }.      if( pIt
249d0 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20  em->pTab ){.    
249e0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
249f0 50 72 69 6e 74 66 28 22 28 74 61 62 6c 65 3a 20  Printf("(table: 
24a00 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  %s)", pItem->pTa
24a10 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
24a20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74   }.      if( pIt
24a30 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  em->zAlias ){.  
24a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
24a50 75 67 50 72 69 6e 74 66 28 22 20 41 53 20 25 73  ugPrintf(" AS %s
24a60 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  ", pItem->zAlias
24a70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
24a80 20 69 66 28 20 69 3c 70 2d 3e 70 53 72 63 2d 3e   if( i<p->pSrc->
24a90 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20 20 20 20  nSrc-1 ){.      
24aa0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24ab0 69 6e 74 66 28 22 2c 22 29 3b 0a 20 20 20 20 20  intf(",");.     
24ac0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
24ad0 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
24ae0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
24af0 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a  f( p->pWhere ){.
24b00 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24b10 50 72 69 6e 74 66 28 22 25 2a 73 20 57 48 45 52  Printf("%*s WHER
24b20 45 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29  E ", indent, "")
24b30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
24b40 6e 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  ntExpr(p->pWhere
24b50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
24b60 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
24b70 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47  .  }.  if( p->pG
24b80 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71  roupBy ){.    sq
24b90 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24ba0 28 22 25 2a 73 20 47 52 4f 55 50 20 42 59 20 22  ("%*s GROUP BY "
24bb0 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20  , indent, "");. 
24bc0 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
24bd0 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
24be0 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBy);.    sqlite
24bf0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
24c00 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ");.  }.  if( p-
24c10 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20  >pHaving ){.    
24c20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24c30 74 66 28 22 25 2a 73 20 48 41 56 49 4e 47 20 22  tf("%*s HAVING "
24c40 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20  , indent, "");. 
24c50 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
24c60 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b  xpr(p->pHaving);
24c70 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
24c80 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
24c90 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64   }.  if( p->pOrd
24ca0 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
24cb0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24cc0 25 2a 73 20 4f 52 44 45 52 20 42 59 20 22 2c 20  %*s ORDER BY ", 
24cd0 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20  indent, "");.   
24ce0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
24cf0 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
24d00 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  y);.    sqlite3D
24d10 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
24d20 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f  ;.  }.}./* End o
24d30 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  f the structure 
24d40 64 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63  debug printing c
24d50 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ode.************
24d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24da0 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  */.#endif /* def
24db0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
24dc0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
24dd0 49 54 45 5f 44 45 42 55 47 29 20 2a 2f 0a        ITE_DEBUG) */.