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

Artifact 1ad267692ab09afe05092eddcb5aba96b796afe1:


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 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
0400: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c  Initialize a Sel
0410: 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
0420: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
0430: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
0440: 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65  (SelectDest *pDe
0450: 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  st, int eDest, i
0460: 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65  nt iParm){.  pDe
0470: 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29  st->eDest = (u8)
0480: 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  eDest;.  pDest->
0490: 69 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20  iParm = iParm;. 
04a0: 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79   pDest->affinity
04b0: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69   = 0;.  pDest->i
04c0: 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  Mem = 0;.  pDest
04d0: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 7d 0a 0a 0a  ->nMem = 0;.}...
04e0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
04f0: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0500: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0510: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0520: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0530: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0540: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0550: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0560: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0570: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
0580: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
0590: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
05a0: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
05b0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
05c0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
05d0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
05e0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
05f0: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0600: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0610: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0620: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0630: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0640: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0650: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0660: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0670: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
0680: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
0690: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
06a0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
06b0: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
06c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
06d0: 69 73 44 69 73 74 69 6e 63 74 2c 20 20 20 20 20  isDistinct,     
06e0: 20 20 2f 2a 20 74 72 75 65 20 69 66 20 74 68 65    /* true if the
06f0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
0700: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
0710: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
0720: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54          /* LIMIT
0730: 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65   value.  NULL me
0740: 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a  ans not used */.
0750: 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20    Expr *pOffset 
0760: 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45          /* OFFSE
0770: 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d  T value.  NULL m
0780: 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a  eans no offset *
0790: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
07a0: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
07b0: 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  andin;.  sqlite3
07c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
07d0: 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
07e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
07f0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
0800: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ) );.  assert( d
0810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0820: 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70  || !pOffset || p
0830: 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53  Limit ); /* OFFS
0840: 45 54 20 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54  ET implies LIMIT
0850: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   */.  if( pNew==
0860: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
0870: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0880: 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  d );.    pNew = 
0890: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65  &standin;.    me
08a0: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
08b0: 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
08c0: 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  }.  if( pEList==
08d0: 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20  0 ){.    pEList 
08e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
08f0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
0900: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
0910: 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20  b,TK_ALL,0));.  
0920: 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  }.  pNew->pEList
0930: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 69 66 28   = pEList;.  if(
0940: 20 70 53 72 63 3d 3d 30 20 29 20 70 53 72 63 20   pSrc==0 ) pSrc 
0950: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
0960: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
0970: 28 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77  (*pSrc));.  pNew
0980: 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
0990: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
09a0: 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e  pWhere;.  pNew->
09b0: 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
09c0: 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  pBy;.  pNew->pHa
09d0: 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a  ving = pHaving;.
09e0: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
09f0: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
0a00: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
0a10: 69 73 44 69 73 74 69 6e 63 74 20 3f 20 53 46 5f  isDistinct ? SF_
0a20: 44 69 73 74 69 6e 63 74 20 3a 20 30 3b 0a 20 20  Distinct : 0;.  
0a30: 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45  pNew->op = TK_SE
0a40: 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  LECT;.  pNew->pL
0a50: 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
0a60: 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
0a70: 20 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65   pOffset;.  asse
0a80: 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c  rt( pOffset==0 |
0a90: 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20  | pLimit!=0 );. 
0aa0: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
0ab0: 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[0] = -1;.  p
0ac0: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
0ad0: 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[1] = -1;.  pNe
0ae0: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
0af0: 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64  2] = -1;.  if( d
0b00: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0b10: 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c  ) {.    clearSel
0b20: 65 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ect(db, pNew);. 
0b30: 20 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73 74     if( pNew!=&st
0b40: 61 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33 44  andin ) sqlite3D
0b50: 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b  bFree(db, pNew);
0b60: 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20  .    pNew = 0;. 
0b70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
0b80: 72 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d  rt( pNew->pSrc!=
0b90: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
0ba0: 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73  r>0 );.  }.  ass
0bb0: 65 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61 6e  ert( pNew!=&stan
0bc0: 64 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  din );.  return 
0bd0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  pNew;.}../*.** D
0be0: 65 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20  elete the given 
0bf0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0c00: 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
0c10: 73 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  substructures..*
0c20: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
0c30: 6c 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74  lectDelete(sqlit
0c40: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
0c50: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
0c60: 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64     clearSelect(d
0c70: 62 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, p);.    sqlit
0c80: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
0c90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  .  }.}../*.** Gi
0ca0: 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74  ven 1 to 3 ident
0cb0: 69 66 69 65 72 73 20 70 72 65 63 65 65 64 69 6e  ifiers preceedin
0cc0: 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f  g the JOIN keywo
0cd0: 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  rd, determine th
0ce0: 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69  e.** type of joi
0cf0: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
0d00: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74  teger constant t
0d10: 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68  hat expresses th
0d20: 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65  at type.** in te
0d30: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  rms of the follo
0d40: 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a  wing bit values:
0d50: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e  .**.**     JT_IN
0d60: 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52  NER.**     JT_CR
0d70: 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55  OSS.**     JT_OU
0d80: 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41  TER.**     JT_NA
0d90: 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f  TURAL.**     JT_
0da0: 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52  LEFT.**     JT_R
0db0: 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c  IGHT.**.** A ful
0dc0: 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20  l outer join is 
0dd0: 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  the combination 
0de0: 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a  of JT_LEFT and J
0df0: 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49  T_RIGHT..**.** I
0e00: 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20  f an illegal or 
0e10: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
0e20: 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74   type is seen, t
0e30: 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
0e40: 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c  .** a join type,
0e50: 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f   but put an erro
0e60: 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  r in the pParse 
0e70: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
0e80: 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70  t sqlite3JoinTyp
0e90: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
0ea0: 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65   Token *pA, Toke
0eb0: 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43  n *pB, Token *pC
0ec0: 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70  ){.  int jointyp
0ed0: 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a  e = 0;.  Token *
0ee0: 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65  apAll[3];.  Toke
0ef0: 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20  n *p;.          
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f10: 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37     /*   01234567
0f20: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
0f30: 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20  456789 123 */.  
0f40: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0f50: 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22  r zKeyText[] = "
0f60: 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69  naturaleftouteri
0f70: 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73  ghtfullinnercros
0f80: 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  s";.  static con
0f90: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
0fa0: 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20  u8 i;        /* 
0fb0: 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79  Beginning of key
0fc0: 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65  word text in zKe
0fd0: 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75  yText[] */.    u
0fe0: 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c  8 nChar;    /* L
0ff0: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79  ength of the key
1000: 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74 65  word in characte
1010: 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64  rs */.    u8 cod
1020: 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74  e;     /* Join t
1030: 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20  ype mask */.  } 
1040: 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20  aKeyword[] = {. 
1050: 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f     /* natural */
1060: 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54   { 0,  7, JT_NAT
1070: 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20 20  URAL            
1080: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65      },.    /* le
1090: 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34  ft    */ { 6,  4
10a0: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
10b0: 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ER          },. 
10c0: 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f     /* outer   */
10d0: 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54   { 10, 5, JT_OUT
10e0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
10f0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69      },.    /* ri
1100: 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35  ght   */ { 14, 5
1110: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
1120: 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  TER         },. 
1130: 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f     /* full    */
1140: 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46   { 19, 4, JT_LEF
1150: 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  T|JT_RIGHT|JT_OU
1160: 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e  TER },.    /* in
1170: 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35  ner   */ { 23, 5
1180: 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20  , JT_INNER      
1190: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
11a0: 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f     /* cross   */
11b0: 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 28, 5, JT_INN
11c0: 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20  ER|JT_CROSS     
11d0: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e      },.  };.  in
11e0: 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b  t i, j;.  apAll[
11f0: 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c  0] = pA;.  apAll
1200: 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c  [1] = pB;.  apAl
1210: 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72  l[2] = pC;.  for
1220: 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41  (i=0; i<3 && apA
1230: 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll[i]; i++){.   
1240: 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20   p = apAll[i];. 
1250: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72     for(j=0; j<Ar
1260: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
1270: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); j++){.      i
1280: 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72  f( p->n==aKeywor
1290: 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20  d[j].nChar .    
12a0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
12b0: 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
12c0: 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b  p->z, &zKeyText[
12d0: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20  aKeyword[j].i], 
12e0: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
12f0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
1300: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65  aKeyword[j].code
1310: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1320: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1330: 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
1340: 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d  0 || j==1 || j==
1350: 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d  2 || j==3 || j==
1360: 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d  4 || j==5 || j==
1370: 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d  6 );.    if( j>=
1380: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1390: 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69  rd) ){.      joi
13a0: 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f  ntype |= JT_ERRO
13b0: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
13c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a      }.  }.  if(.
13d0: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
13e0: 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55   (JT_INNER|JT_OU
13f0: 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52  TER))==(JT_INNER
1400: 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20  |JT_OUTER) ||.  
1410: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a     (jointype & J
1420: 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b  T_ERROR)!=0.  ){
1430: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1440: 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20  *zSp = " ";.    
1450: 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b  assert( pB!=0 );
1460: 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29  .    if( pC==0 )
1470: 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73  { zSp++; }.    s
1480: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1490: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
14a0: 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a  or unsupported j
14b0: 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20  oin type: ".    
14c0: 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c 20     "%T %T%s%T", 
14d0: 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29  pA, pB, zSp, pC)
14e0: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
14f0: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
1500: 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65  se if( (jointype
1510: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
1520: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f  .         && (jo
1530: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
1540: 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54  T|JT_RIGHT))!=JT
1550: 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c  _LEFT ){.    sql
1560: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1570: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47  rse, .      "RIG
1580: 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45  HT and FULL OUTE
1590: 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20  R JOINs are not 
15a0: 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72  currently suppor
15b0: 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  ted");.    joint
15c0: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
15d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69    }.  return joi
15e0: 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ntype;.}../*.** 
15f0: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1600: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
1610: 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  a table.  Return
1620: 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d   -1 if the colum
1630: 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74  n.** is not cont
1640: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62  ained in the tab
1650: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1660: 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61  t columnIndex(Ta
1670: 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74  ble *pTab, const
1680: 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20   char *zCol){.  
1690: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
16a0: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
16b0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
16c0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61  lite3StrICmp(pTa
16d0: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  b->aCol[i].zName
16e0: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74  , zCol)==0 ) ret
16f0: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
1700: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
1710: 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72 73   Search the firs
1720: 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53  t N tables in pS
1730: 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  rc, from left to
1740: 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20   right, looking 
1750: 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74  for a.** table t
1760: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e  hat has a column
1770: 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a   named zCol.  .*
1780: 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c  *.** When found,
1790: 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20   set *piTab and 
17a0: 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61  *piCol to the ta
17b0: 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f  ble index and co
17c0: 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66  lumn index.** of
17d0: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f   the matching co
17e0: 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20  lumn and return 
17f0: 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  TRUE..**.** If n
1800: 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ot found, return
1810: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
1820: 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f  c int tableAndCo
1830: 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63  lumnIndex(.  Src
1840: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
1850: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61    /* Array of ta
1860: 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a  bles to search *
1870: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
1880: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1890: 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
18a0: 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61  pSrc->a[] to sea
18b0: 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  rch */.  const c
18c0: 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a  har *zCol,    /*
18d0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
18e0: 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  umn we are looki
18f0: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ng for */.  int 
1900: 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  *piTab,         
1910: 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20   /* Write index 
1920: 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72  of pSrc->a[] her
1930: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f  e */.  int *piCo
1940: 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l           /* W
1950: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
1960: 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54  rc->a[*piTab].pT
1970: 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20  ab->aCol[] here 
1980: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19a0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
19b0: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20   tables in pSrc 
19c0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
19d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
19e0: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74  ex of column mat
19f0: 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20  ching zCol */.. 
1a00: 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62 3d   assert( (piTab=
1a10: 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20  =0)==(piCol==0) 
1a20: 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e  );  /* Both or n
1a30: 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20  either are NULL 
1a40: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1a50: 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f  N; i++){.    iCo
1a60: 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  l = columnIndex(
1a70: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c  pSrc->a[i].pTab,
1a80: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20   zCol);.    if( 
1a90: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
1aa0: 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20   if( piTab ){.  
1ab0: 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69        *piTab = i
1ac0: 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c  ;.        *piCol
1ad0: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d   = iCol;.      }
1ae0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1af0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1b00: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1b10: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1b20: 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65 72   used to add ter
1b30: 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f  ms implied by JO
1b40: 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65  IN syntax to the
1b50: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
1b60: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61   expression of a
1b70: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1b80: 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c  t. The new term,
1b90: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44   which.** is AND
1ba0: 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73  ed with the exis
1bb0: 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73  ting WHERE claus
1bc0: 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  e, is of the for
1bd0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62  m:.**.**    (tab
1be0: 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f  1.col1 = tab2.co
1bf0: 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  l2).**.** where 
1c00: 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72 63  tab1 is the iSrc
1c10: 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63  'th table in Src
1c20: 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74 61  List pSrc and ta
1c30: 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69  b2 is the .** (i
1c40: 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d  Src+1)'th. Colum
1c50: 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e  n col1 is column
1c60: 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62   iColLeft of tab
1c70: 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a  1, and col2 is.*
1c80: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67  * column iColRig
1c90: 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73  ht of tab2..*/.s
1ca0: 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68  tatic void addWh
1cb0: 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ereTerm(.  Parse
1cc0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1ce0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1cf0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1d00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d10: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
1d20: 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61  bles in FROM cla
1d30: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
1d40: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
1d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1d60: 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65  x of first table
1d70: 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63   to join in pSrc
1d80: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65   */.  int iColLe
1d90: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
1da0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1db0: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73  f column in firs
1dc0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
1dd0: 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20 20   iRight,        
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1df0: 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20  Index of second 
1e00: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f  table in pSrc */
1e10: 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74  .  int iColRight
1e20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e30: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
1e40: 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20  olumn in second 
1e50: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1e60: 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20  sOuterJoin,     
1e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1e80: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
1e90: 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20   OUTER join */. 
1ea0: 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20   Expr **ppWhere 
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20   /* IN/OUT: The 
1ed0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
1ee0: 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  add to */.){.  s
1ef0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1f00: 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
1f10: 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45  *pE1;.  Expr *pE
1f20: 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a  2;.  Expr *pEq;.
1f30: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66 74  .  assert( iLeft
1f40: 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  <iRight );.  ass
1f50: 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e  ert( pSrc->nSrc>
1f60: 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65  iRight );.  asse
1f70: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66  rt( pSrc->a[iLef
1f80: 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73  t].pTab );.  ass
1f90: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69  ert( pSrc->a[iRi
1fa0: 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20  ght].pTab );..  
1fb0: 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pE1 = sqlite3Cre
1fc0: 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62  ateColumnExpr(db
1fd0: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
1fe0: 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20  ColLeft);.  pE2 
1ff0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43  = sqlite3CreateC
2000: 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53  olumnExpr(db, pS
2010: 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c  rc, iRight, iCol
2020: 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d  Right);..  pEq =
2030: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2040: 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31  arse, TK_EQ, pE1
2050: 2c 20 70 45 32 2c 20 30 29 3b 0a 20 20 69 66 28  , pE2, 0);.  if(
2060: 20 70 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a   pEq && isOuterJ
2070: 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53  oin ){.    ExprS
2080: 65 74 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  etProperty(pEq, 
2090: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
20a0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
20b0: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
20c0: 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  q, EP_TokenOnly|
20d0: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
20e0: 20 20 20 45 78 70 72 53 65 74 49 72 72 65 64 75     ExprSetIrredu
20f0: 63 69 62 6c 65 28 70 45 71 29 3b 0a 20 20 20 20  cible(pEq);.    
2100: 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  pEq->iRightJoinT
2110: 61 62 6c 65 20 3d 20 28 69 31 36 29 70 45 32 2d  able = (i16)pE2-
2120: 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a  >iTable;.  }.  *
2130: 70 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  ppWhere = sqlite
2140: 33 45 78 70 72 41 6e 64 28 64 62 2c 20 2a 70 70  3ExprAnd(db, *pp
2150: 57 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a  Where, pEq);.}..
2160: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50  /*.** Set the EP
2170: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
2180: 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20  ty on all terms 
2190: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  of the given exp
21a0: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20  ression..** And 
21b0: 73 65 74 20 74 68 65 20 45 78 70 72 2e 69 52 69  set the Expr.iRi
21c0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20  ghtJoinTable to 
21d0: 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79  iTable for every
21e0: 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20   term in the.** 
21f0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
2200: 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  * The EP_FromJoi
2210: 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73  n property is us
2220: 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61  ed on terms of a
2230: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  n expression to 
2240: 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54  tell.** the LEFT
2250: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63   OUTER JOIN proc
2260: 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61  essing logic tha
2270: 74 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70  t this term is p
2280: 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f  art of the.** jo
2290: 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73  in restriction s
22a0: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
22b0: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
22c0: 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72  se and not a par
22d0: 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65  t.** of the more
22e0: 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63   general WHERE c
22f0: 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65  lause.  These te
2300: 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76  rms are moved ov
2310: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45  er to the.** WHE
2320: 52 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67  RE clause during
2330: 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67   join processing
2340: 20 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20   but we need to 
2350: 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68  remember that th
2360: 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64  ey.** originated
2370: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
2380: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ING clause..**.*
2390: 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69 67 68  * The Expr.iRigh
23a0: 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73  tJoinTable tells
23b0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
23c0: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61  e processing tha
23d0: 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  t the.** express
23e0: 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ion depends on t
23f0: 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54  able iRightJoinT
2400: 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61  able even if tha
2410: 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a  t table is not.*
2420: 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e  * explicitly men
2430: 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78  tioned in the ex
2440: 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20  pression.  That 
2450: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e  information is n
2460: 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73  eeded.** for cas
2470: 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  es like this:.**
2480: 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
2490: 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
24a0: 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
24b0: 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a  b AND t1.x=5.**.
24c0: 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c 61  ** The where cla
24d0: 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66  use needs to def
24e0: 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20  er the handling 
24f0: 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a  of the t1.x=5.**
2500: 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65   term until afte
2510: 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66  r the t2 loop of
2520: 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74   the join.  In t
2530: 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55  hat way, a.** NU
2540: 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62  LL t2 row will b
2550: 65 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65  e inserted whene
2560: 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66  ver t1.x!=5.  If
2570: 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65   we do not.** de
2580: 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67  fer the handling
2590: 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77   of t1.x=5, it w
25a0: 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64  ill be processed
25b0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
25c0: 61 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f  after the t1 loo
25d0: 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20  p and rows with 
25e0: 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76  t1.x!=5 will nev
25f0: 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20  er appear in.** 
2600: 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63  the output, whic
2610: 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a  h is incorrect..
2620: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2630: 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20  etJoinExpr(Expr 
2640: 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b  *p, int iTable){
2650: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
2660: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
2670: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
2680: 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  n);.    assert( 
2690: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
26a0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
26b0: 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
26c0: 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 49 72  );.    ExprSetIr
26d0: 72 65 64 75 63 69 62 6c 65 28 70 29 3b 0a 20 20  reducible(p);.  
26e0: 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54    p->iRightJoinT
26f0: 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62  able = (i16)iTab
2700: 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45  le;.    setJoinE
2710: 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54  xpr(p->pLeft, iT
2720: 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70  able);.    p = p
2730: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d  ->pRight;.  } .}
2740: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2750: 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74  tine processes t
2760: 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74  he join informat
2770: 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54  ion for a SELECT
2780: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f   statement..** O
2790: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
27a0: 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65  ses are converte
27b0: 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72  d into extra ter
27c0: 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
27d0: 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52  clause..** NATUR
27e0: 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72  AL joins also cr
27f0: 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45  eate extra WHERE
2800: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a   clause terms..*
2810: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f  *.** The terms o
2820: 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  f a FROM clause 
2830: 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  are contained in
2840: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63   the Select.pSrc
2850: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54   structure..** T
2860: 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62  he left most tab
2870: 6c 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20  le is the first 
2880: 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e  entry in Select.
2890: 70 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74  pSrc.  The right
28a0: 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69  -most.** table i
28b0: 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  s the last entry
28c0: 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72  .  The join oper
28d0: 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20  ator is held in 
28e0: 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20  the entry to.** 
28f0: 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20  the left.  Thus 
2900: 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73  entry 0 contains
2910: 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   the join operat
2920: 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20  or for the join 
2930: 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69  between.** entri
2940: 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79  es 0 and 1.  Any
2950: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2960: 75 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  uses associated 
2970: 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72  with the join ar
2980: 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68  e.** also attach
2990: 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65  ed to the left e
29a0: 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ntry..**.** This
29b0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
29c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
29d0: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
29e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
29f0: 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
2a00: 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  in(Parse *pParse
2a10: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
2a20: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e  /* All tables in
2a50: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2a60: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2a90: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75  unters */.  stru
2aa0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2ab0: 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c  *pLeft;     /* L
2ac0: 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  eft table being 
2ad0: 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  joined */.  stru
2ae0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2af0: 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52  *pRight;    /* R
2b00: 69 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67  ight table being
2b10: 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53   joined */..  pS
2b20: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
2b30: 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61  pLeft = &pSrc->a
2b40: 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20  [0];.  pRight = 
2b50: 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72  &pLeft[1];.  for
2b60: 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
2b70: 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68  rc-1; i++, pRigh
2b80: 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20  t++, pLeft++){. 
2b90: 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54     Table *pLeftT
2ba0: 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62  ab = pLeft->pTab
2bb0: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69  ;.    Table *pRi
2bc0: 67 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d  ghtTab = pRight-
2bd0: 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69  >pTab;.    int i
2be0: 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28  sOuter;..    if(
2bf0: 20 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62 3d   NEVER(pLeftTab=
2c00: 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d  =0 || pRightTab=
2c10: 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =0) ) continue;.
2c20: 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70      isOuter = (p
2c30: 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20  Right->jointype 
2c40: 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a  & JT_OUTER)!=0;.
2c50: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  .    /* When the
2c60: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
2c70: 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64   is present, add
2c80: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
2c90: 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65  rms for.    ** e
2ca0: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74  very column that
2cb0: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
2cc0: 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a  have in common..
2cd0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2ce0: 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20  Right->jointype 
2cf0: 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a  & JT_NATURAL ){.
2d00: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
2d10: 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d  ->pOn || pRight-
2d20: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
2d30: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2d40: 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41  sg(pParse, "a NA
2d50: 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e  TURAL join may n
2d60: 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20  ot have ".      
2d70: 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55       "an ON or U
2d80: 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29  SING clause", 0)
2d90: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2da0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
2db0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69    for(j=0; j<pRi
2dc0: 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  ghtTab->nCol; j+
2dd0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
2de0: 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61   *zName;   /* Na
2df0: 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20  me of column in 
2e00: 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
2e10: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
2e20: 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74  Left;     /* Mat
2e30: 63 68 69 6e 67 20 6c 65 66 74 20 74 61 62 6c 65  ching left table
2e40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
2e50: 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61  iLeftCol;  /* Ma
2e60: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e  tching column in
2e70: 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20   the left table 
2e80: 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  */..        zNam
2e90: 65 20 3d 20 70 52 69 67 68 74 54 61 62 2d 3e 61  e = pRightTab->a
2ea0: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col[j].zName;.  
2eb0: 20 20 20 20 20 20 69 66 28 20 74 61 62 6c 65 41        if( tableA
2ec0: 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53  ndColumnIndex(pS
2ed0: 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20  rc, i+1, zName, 
2ee0: 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f  &iLeft, &iLeftCo
2ef0: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
2f00: 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61  addWhereTerm(pPa
2f10: 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74  rse, pSrc, iLeft
2f20: 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c  , iLeftCol, i+1,
2f30: 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   j,.            
2f40: 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74             isOut
2f50: 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b  er, &p->pWhere);
2f60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f70: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2f80: 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f   Disallow both O
2f90: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
2fa0: 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ses in the same 
2fb0: 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  join.    */.    
2fc0: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20  if( pRight->pOn 
2fd0: 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e  && pRight->pUsin
2fe0: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
2ff0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
3000: 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20  e, "cannot have 
3010: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
3020: 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61  G ".        "cla
3030: 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65  uses in the same
3040: 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72   join");.      r
3050: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a  eturn 1;.    }..
3060: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f      /* Add the O
3070: 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  N clause to the 
3080: 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
3090: 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74   clause, connect
30a0: 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20  ed by.    ** an 
30b0: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20  AND operator..  
30c0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
30d0: 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20  ght->pOn ){.    
30e0: 20 20 69 66 28 20 69 73 4f 75 74 65 72 20 29 20    if( isOuter ) 
30f0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67  setJoinExpr(pRig
3100: 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d  ht->pOn, pRight-
3110: 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
3120: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c   p->pWhere = sql
3130: 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
3140: 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72  se->db, p->pWher
3150: 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b  e, pRight->pOn);
3160: 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70  .      pRight->p
3170: 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  On = 0;.    }.. 
3180: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74     /* Create ext
3190: 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20  ra terms on the 
31a0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72  WHERE clause for
31b0: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d   each column nam
31c0: 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  ed.    ** in the
31d0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20   USING clause.  
31e0: 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20  Example: If the 
31f0: 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65  two tables to be
3200: 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20   joined are .   
3210: 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20   ** A and B and 
3220: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3230: 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64   names X, Y, and
3240: 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69   Z, then add thi
3250: 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  s.    ** to the 
3260: 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20  WHERE clause:   
3270: 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59   A.X=B.X AND A.Y
3280: 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a  =B.Y AND A.Z=B.Z
3290: 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61  .    ** Report a
32a0: 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63  n error if any c
32b0: 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20  olumn mentioned 
32c0: 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  in the USING cla
32d0: 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  use is.    ** no
32e0: 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62  t contained in b
32f0: 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65  oth tables to be
3300: 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a   joined..    */.
3310: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
3320: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
3330: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  IdList *pList = 
3340: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a  pRight->pUsing;.
3350: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
3360: 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b  <pList->nId; j++
3370: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
3380: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e  *zName;     /* N
3390: 61 6d 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20  ame of the term 
33a0: 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  in the USING cla
33b0: 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  use */.        i
33c0: 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 20 20  nt iLeft;       
33d0: 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68 65 20  /* Table on the 
33e0: 6c 65 66 74 20 77 69 74 68 20 6d 61 74 63 68 69  left with matchi
33f0: 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  ng column name *
3400: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c  /.        int iL
3410: 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f  eftCol;    /* Co
3420: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d  lumn number of m
3430: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f  atching column o
3440: 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20  n the left */.  
3450: 20 20 20 20 20 20 69 6e 74 20 69 52 69 67 68 74        int iRight
3460: 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  Col;   /* Column
3470: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   number of match
3480: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68  ing column on th
3490: 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20  e right */..    
34a0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73      zName = pLis
34b0: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[j].zName;. 
34c0: 20 20 20 20 20 20 20 69 52 69 67 68 74 43 6f 6c         iRightCol
34d0: 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70   = columnIndex(p
34e0: 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29  RightTab, zName)
34f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52  ;.        if( iR
3500: 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20  ightCol<0.      
3510: 20 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43     || !tableAndC
3520: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c  olumnIndex(pSrc,
3530: 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c   i+1, zName, &iL
3540: 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a  eft, &iLeftCol).
3550: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
3560: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
3570: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61  rMsg(pParse, "ca
3580: 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20  nnot join using 
3590: 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75  column %s - colu
35a0: 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  mn ".           
35b0: 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e   "not present in
35c0: 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a   both tables", z
35d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
35e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
35f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64     }.        add
3600: 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65  WhereTerm(pParse
3610: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
3620: 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52  LeftCol, i+1, iR
3630: 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20  ightCol,.       
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
3650: 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72  Outer, &p->pWher
3660: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
3670: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
3680: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
3690: 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76 22 20  t code into "v" 
36a0: 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74  that will push t
36b0: 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74 68 65  he record on the
36c0: 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73   top of the.** s
36d0: 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f  tack into the so
36e0: 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rter..*/.static 
36f0: 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72  void pushOntoSor
3700: 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ter(.  Parse *pP
3710: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
3720: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
3730: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
3740: 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a 20 54  OrderBy,    /* T
3750: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
3760: 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  se */.  Select *
3770: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 2f  pSelect,       /
3780: 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45  * The whole SELE
3790: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
37a0: 20 20 69 6e 74 20 72 65 67 44 61 74 61 20 20 20    int regData   
37b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
37c0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74  ster holding dat
37d0: 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  a to be sorted *
37e0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
37f0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
3800: 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4f    int nExpr = pO
3810: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
3820: 20 69 6e 74 20 72 65 67 42 61 73 65 20 3d 20 73   int regBase = s
3830: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
3840: 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72  ge(pParse, nExpr
3850: 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65 67 52 65  +2);.  int regRe
3860: 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
3870: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
3880: 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 73 71  ;.  int op;.  sq
3890: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
38a0: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 73  ear(pParse);.  s
38b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
38c0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
38d0: 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61 73 65  OrderBy, regBase
38e0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
38f0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3900: 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64 65 72  Sequence, pOrder
3910: 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65  By->iECursor, re
3920: 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20  gBase+nExpr);.  
3930: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
3940: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 44  ove(pParse, regD
3950: 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78  ata, regBase+nEx
3960: 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71 6c 69  pr+1, 1);.  sqli
3970: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
3980: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
3990: 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72 20 2b  regBase, nExpr +
39a0: 20 32 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a   2, regRecord);.
39b0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 73    if( pSelect->s
39c0: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65  elFlags & SF_Use
39d0: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f 70  Sorter ){.    op
39e0: 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65   = OP_SorterInse
39f0: 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rt;.  }else{.   
3a00: 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65   op = OP_IdxInse
3a10: 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rt;.  }.  sqlite
3a20: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
3a30: 70 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  p, pOrderBy->iEC
3a40: 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64  ursor, regRecord
3a50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
3a60: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
3a70: 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
3a80: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
3a90: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
3aa0: 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72 2b   regBase, nExpr+
3ab0: 32 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63  2);.  if( pSelec
3ac0: 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  t->iLimit ){.   
3ad0: 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72   int addr1, addr
3ae0: 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69  2;.    int iLimi
3af0: 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  t;.    if( pSele
3b00: 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20  ct->iOffset ){. 
3b10: 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53       iLimit = pS
3b20: 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31  elect->iOffset+1
3b30: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3b40: 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c     iLimit = pSel
3b50: 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ect->iLimit;.   
3b60: 20 7d 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73   }.    addr1 = s
3b70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
3b80: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69  (v, OP_IfZero, i
3b90: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69  Limit);.    sqli
3ba0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3bb0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d   OP_AddImm, iLim
3bc0: 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64  it, -1);.    add
3bd0: 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
3be0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
3bf0: 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  o);.    sqlite3V
3c00: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
3c10: 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddr1);.    sqlit
3c20: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
3c30: 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72 42  OP_Last, pOrderB
3c40: 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  y->iECursor);.  
3c50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3c60: 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  Op1(v, OP_Delete
3c70: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
3c80: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
3c90: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
3ca0: 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a  , addr2);.  }.}.
3cb0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
3cc0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
3cd0: 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69   OFFSET.*/.stati
3ce0: 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65  c void codeOffse
3cf0: 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  t(.  Vdbe *v,   
3d00: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
3d10: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
3d20: 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74  s VM */.  Select
3d30: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
3d40: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
3d50: 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ent being coded 
3d60: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
3d70: 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ue     /* Jump h
3d80: 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20  ere to skip the 
3d90: 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a  current record *
3da0: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f  /.){.  if( p->iO
3db0: 66 66 73 65 74 20 26 26 20 69 43 6f 6e 74 69 6e  ffset && iContin
3dc0: 75 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ue!=0 ){.    int
3dd0: 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c 69 74   addr;.    sqlit
3de0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3df0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f  OP_AddImm, p->iO
3e00: 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20  ffset, -1);.    
3e10: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
3e20: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
3e30: 66 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74  fNeg, p->iOffset
3e40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3e50: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
3e60: 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75  oto, 0, iContinu
3e70: 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  e);.    VdbeComm
3e80: 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 4f 46  ent((v, "skip OF
3e90: 46 53 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b  FSET records"));
3ea0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3eb0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
3ec0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3ed0: 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69  Add code that wi
3ee0: 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ll check to make
3ef0: 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67 69   sure the N regi
3f00: 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
3f10: 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61  t iMem.** form a
3f20: 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e   distinct entry.
3f30: 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74    iTab is a sort
3f40: 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68  ing index that h
3f50: 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a  olds previously.
3f60: 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74  ** seen combinat
3f70: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61  ions of the N va
3f80: 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74  lues.  A new ent
3f90: 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54  ry is made in iT
3fa0: 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72  ab.** if the cur
3fb0: 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72  rent N values ar
3fc0: 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  e new..**.** A j
3fd0: 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61  ump to addrRepea
3fe0: 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68  t is made and th
3ff0: 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65  e N+1 values are
4000: 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
4010: 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65  .** stack if the
4020: 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20   top N elements 
4030: 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74  are not distinct
4040: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4050: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20   codeDistinct(. 
4060: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4070: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
4080: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
4090: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
40a0: 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20  int iTab,       
40b0: 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20     /* A sorting 
40c0: 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65  index used to te
40d0: 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e  st for distinctn
40e0: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ess */.  int add
40f0: 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a  rRepeat,    /* J
4100: 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e  ump to here if n
4110: 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  ot distinct */. 
4120: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
4130: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4140: 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   elements */.  i
4150: 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20  nt iMem         
4160: 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65    /* First eleme
4170: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  nt */.){.  Vdbe 
4180: 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20  *v;.  int r1;.. 
4190: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
41a0: 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74  be;.  r1 = sqlit
41b0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
41c0: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
41d0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
41e0: 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20  OP_Found, iTab, 
41f0: 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d  addrRepeat, iMem
4200: 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , N);.  sqlite3V
4210: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4220: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d  MakeRecord, iMem
4230: 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  , N, r1);.  sqli
4240: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4250: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
4260: 54 61 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  Tab, r1);.  sqli
4270: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
4280: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
4290: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
42a0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
42b0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
42c0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
42d0: 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20  hen a SELECT is 
42e0: 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 73 75  used within a su
42f0: 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28  bexpression.** (
4300: 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20  example:  "a IN 
4310: 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
4320: 61 62 6c 65 29 22 29 20 62 75 74 20 69 74 20 68  able)") but it h
4330: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72  as more than 1 r
4340: 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e  esult.** column.
4350: 20 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20    We do this in 
4360: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63  a subroutine bec
4370: 61 75 73 65 20 74 68 65 20 65 72 72 6f 72 20 75  ause the error u
4380: 73 65 64 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  sed to occur.** 
4390: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63  in multiple plac
43a0: 65 73 2e 20 20 28 54 68 65 20 65 72 72 6f 72 20  es.  (The error 
43b0: 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 6e 20 6f  only occurs in o
43c0: 6e 65 20 70 6c 61 63 65 20 6e 6f 77 2c 20 62 75  ne place now, bu
43d0: 74 20 77 65 0a 2a 2a 20 72 65 74 61 69 6e 20 74  t we.** retain t
43e0: 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f  he subroutine to
43f0: 20 6d 69 6e 69 6d 69 7a 65 20 63 6f 64 65 20 64   minimize code d
4400: 69 73 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73  isruption.).*/.s
4410: 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46  tatic int checkF
4420: 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c  orMultiColumnSel
4430: 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73  ectError(.  Pars
4440: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
4450: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
4460: 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  t. */.  SelectDe
4470: 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20  st *pDest,   /* 
4480: 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53  Destination of S
4490: 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f  ELECT results */
44a0: 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20  .  int nExpr    
44b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
44c0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
44d0: 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  mns returned by 
44e0: 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69  SELECT */.){.  i
44f0: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
4500: 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e  ->eDest;.  if( n
4510: 45 78 70 72 3e 31 20 26 26 20 28 65 44 65 73 74  Expr>1 && (eDest
4520: 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
4530: 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a  st==SRT_Set) ){.
4540: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4550: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c  Msg(pParse, "onl
4560: 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c  y a single resul
4570: 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a  t allowed for ".
4580: 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54         "a SELECT
4590: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
45a0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29   an expression")
45b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
45c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
45d0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  urn 0;.  }.}.#en
45e0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
45f0: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
4600: 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74  s the code for t
4610: 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65  he inside of the
4620: 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f   inner loop.** o
4630: 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a  f a SELECT..**.*
4640: 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e 64 20  * If srcTab and 
4650: 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68  nColumn are both
4660: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
4670: 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f  pEList expressio
4680: 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61  ns.** are evalua
4690: 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
46a0: 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72  get the data for
46b0: 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e   this row.  If n
46c0: 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e  Column>0.** then
46d0: 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20   data is pulled 
46e0: 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20  from srcTab and 
46f0: 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f  pEList is used o
4700: 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a  nly to get the.*
4710: 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f 72 20  * datatypes for 
4720: 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  each column..*/.
4730: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
4740: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50  ctInnerLoop(.  P
4750: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4760: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
4770: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
4780: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
4790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
47a0: 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74   complete select
47b0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
47c0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72   coded */.  Expr
47d0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
47e0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76      /* List of v
47f0: 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74 72  alues being extr
4800: 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  acted */.  int s
4810: 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  rcTab,          
4820: 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20     /* Pull data 
4830: 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20  from this table 
4840: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
4850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
4860: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
4870: 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20  s in the source 
4880: 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
4890: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
48a0: 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c     /* If not NUL
48b0: 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20  L, sort results 
48c0: 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a  using this key *
48d0: 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74  /.  int distinct
48e0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
48f0: 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65  f >=0, make sure
4900: 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73   results are dis
4910: 74 69 6e 63 74 20 2a 2f 0a 20 20 53 65 6c 65 63  tinct */.  Selec
4920: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
4930: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73     /* How to dis
4940: 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75  pose of the resu
4950: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  lts */.  int iCo
4960: 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20  ntinue,         
4970: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
4980: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
4990: 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ext row */.  int
49a0: 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20   iBreak         
49b0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
49c0: 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
49d0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
49e0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
49f0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
4a00: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
4a10: 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20   hasDistinct;   
4a20: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
4a30: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
4a40: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
4a50: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75  */.  int regResu
4a60: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lt;             
4a70: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d   /* Start of mem
4a80: 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ory holding resu
4a90: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  lt set */.  int 
4aa0: 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65  eDest = pDest->e
4ab0: 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74  Dest;   /* How t
4ac0: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73  o dispose of res
4ad0: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ults */.  int iP
4ae0: 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 50 61  arm = pDest->iPa
4af0: 72 6d 3b 20 20 20 2f 2a 20 46 69 72 73 74 20 61  rm;   /* First a
4b00: 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f  rgument to dispo
4b10: 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  sal method */.  
4b20: 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  int nResultCol; 
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4b40: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
4b50: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73  columns */..  as
4b60: 73 65 72 74 28 20 76 20 29 3b 0a 20 20 69 66 28  sert( v );.  if(
4b70: 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
4b80: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
4b90: 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
4ba0: 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 64 69  hasDistinct = di
4bb0: 73 74 69 6e 63 74 3e 3d 30 3b 0a 20 20 69 66 28  stinct>=0;.  if(
4bc0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20   pOrderBy==0 && 
4bd0: 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  !hasDistinct ){.
4be0: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
4bf0: 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , p, iContinue);
4c00: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20  .  }..  /* Pull 
4c10: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
4c20: 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  lumns..  */.  if
4c30: 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20  ( nColumn>0 ){. 
4c40: 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20     nResultCol = 
4c50: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65  nColumn;.  }else
4c60: 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c  {.    nResultCol
4c70: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
4c80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65 73  ;.  }.  if( pDes
4c90: 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20  t->iMem==0 ){.  
4ca0: 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20    pDest->iMem = 
4cb0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
4cc0: 20 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20      pDest->nMem 
4cd0: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
4ce0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
4cf0: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
4d00: 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61 73 73 65  }else{ .    asse
4d10: 72 74 28 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 3d  rt( pDest->nMem=
4d20: 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a 20  =nResultCol );. 
4d30: 20 7d 0a 20 20 72 65 67 52 65 73 75 6c 74 20 3d   }.  regResult =
4d40: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3b 0a 20 20   pDest->iMem;.  
4d50: 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b  if( nColumn>0 ){
4d60: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4d70: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
4d80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4d90: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
4da0: 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20  umn, srcTab, i, 
4db0: 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20  regResult+i);.  
4dc0: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
4dd0: 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74  eDest!=SRT_Exist
4de0: 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  s ){.    /* If t
4df0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
4e00: 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29  s an EXISTS(...)
4e10: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
4e20: 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76   actual.    ** v
4e30: 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 62  alues returned b
4e40: 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  y the SELECT are
4e50: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
4e60: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
4e70: 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
4e80: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71 6c  pParse);.    sql
4e90: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
4ea0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c  List(pParse, pEL
4eb0: 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ist, regResult, 
4ec0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
4ed0: 74 29 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d  t);.  }.  nColum
4ee0: 6e 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  n = nResultCol;.
4ef0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
4f00: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
4f10: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
4f20: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4f30: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
4f40: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
4f50: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
4f60: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
4f70: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
4f80: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
4f90: 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69  /.  if( hasDisti
4fa0: 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nct ){.    asser
4fb0: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
4fc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
4fd0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75  st->nExpr==nColu
4fe0: 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65 44 69  mn );.    codeDi
4ff0: 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 64  stinct(pParse, d
5000: 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e 74 69 6e  istinct, iContin
5010: 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67  ue, nColumn, reg
5020: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 69 66 28  Result);.    if(
5030: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
5040: 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74        codeOffset
5050: 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
5060: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
5070: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
5080: 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
5090: 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68  mode, write each
50a0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f   query result to
50b0: 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
50c0: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a  temporary.    **
50d0: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
50e0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
50f0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
5100: 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73  D_SELECT.    cas
5110: 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20  e SRT_Union: {. 
5120: 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20       int r1;.   
5130: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
5140: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
5150: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5160: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5170: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
5180: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c  Result, nColumn,
5190: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
51a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
51b0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
51c0: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
51d0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
51e0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
51f0: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
5200: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
5210: 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72  onstruct a recor
5220: 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79  d from the query
5230: 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73   result, but ins
5240: 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73  tead of.    ** s
5250: 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72  aving that recor
5260: 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b  d, use it as a k
5270: 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65  ey to delete ele
5280: 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a  ments from.    *
5290: 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
52a0: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
52b0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
52c0: 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20  _Except: {.     
52d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
52e0: 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65  p3(v, OP_IdxDele
52f0: 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65  te, iParm, regRe
5300: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  sult, nColumn);.
5310: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5320: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
5330: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
5340: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
5350: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
5360: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
5370: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
5380: 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
5390: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20   {.      int r1 
53a0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
53b0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
53c0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
53d0: 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
53e0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
53f0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65   eDest==SRT_Ephe
5400: 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71  mTab );.      sq
5410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5420: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
5430: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
5440: 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20  lumn, r1);.     
5450: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
5460: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
5470: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
5480: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29  pOrderBy, p, r1)
5490: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
54a0: 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20         int r2 = 
54b0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
54c0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
54d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
54e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
54f0: 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b  wid, iParm, r2);
5500: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5510: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5520: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
5530: 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20  r1, r2);.       
5540: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5550: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
5560: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20  PPEND);.        
5570: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
5580: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
5590: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
55a0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
55b0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
55c0: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
55d0: 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
55e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
55f0: 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77  UERY.    /* If w
5600: 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61  e are creating a
5610: 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70   set for an "exp
5620: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
5630: 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20  )" construct,.  
5640: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
5650: 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67  should be a sing
5660: 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73  le item on the s
5670: 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69  tack.  Write thi
5680: 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e  s.    ** item in
5690: 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65  to the set table
56a0: 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61   with bogus data
56b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
56c0: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
56d0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
56e0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70  mn==1 );.      p
56f0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
5700: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
5710: 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  ity(pEList->a[0]
5720: 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61  .pExpr, pDest->a
5730: 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20  ffinity);.      
5740: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
5750: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69          /* At fi
5760: 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77  rst glance you w
5770: 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f  ould think we co
5780: 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74  uld optimize out
5790: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
57a0: 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68 69 73  ORDER BY in this
57b0: 20 63 61 73 65 20 73 69 6e 63 65 20 74 68 65 20   case since the 
57c0: 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73  order of entries
57d0: 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20   in the set.    
57e0: 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
57f0: 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74 68 65  matter.  But the
5800: 72 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49  re might be a LI
5810: 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77  MIT clause, in w
5820: 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  hich.        ** 
5830: 63 61 73 65 20 74 68 65 20 6f 72 64 65 72 20 64  case the order d
5840: 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20  oes matter */.  
5850: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
5860: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
5870: 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73  derBy, p, regRes
5880: 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ult);.      }els
5890: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
58a0: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
58b0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
58c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
58d0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
58e0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
58f0: 73 75 6c 74 2c 20 31 2c 20 72 31 2c 20 26 70 2d  sult, 1, r1, &p-
5900: 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  >affinity, 1);. 
5910: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
5920: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
5930: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
5940: 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20  gResult, 1);.   
5950: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5960: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
5970: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
5980: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
5990: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
59a0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
59b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
59c0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
59d0: 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69  * If any row exi
59e0: 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  st in the result
59f0: 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61   set, record tha
5a00: 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74  t fact and abort
5a10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
5a20: 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a  e SRT_Exists: {.
5a30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5a40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
5a50: 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29  teger, 1, iParm)
5a60: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
5a70: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
5a80: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
5a90: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
5aa0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5ab0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
5ac0: 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
5ad0: 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
5ae0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
5af0: 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
5b00: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
5b10: 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
5b20: 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
5b30: 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
5b40: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
5b50: 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
5b60: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
5b70: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5b80: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
5b90: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
5ba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
5bb0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
5bc0: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20  e, pOrderBy, p, 
5bd0: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
5be0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5bf0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
5c00: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
5c10: 52 65 73 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31  Result, iParm, 1
5c20: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
5c30: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
5c40: 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
5c50: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
5c60: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
5c70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
5c80: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
5c90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
5ca0: 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
5cb0: 53 65 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f  Send the data to
5cc0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75   the callback fu
5cd0: 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73  nction or to a s
5ce0: 75 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74  ubroutine.  In t
5cf0: 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f  he.    ** case o
5d00: 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20  f a subroutine, 
5d10: 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  the subroutine i
5d20: 74 73 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73  tself is respons
5d30: 69 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20  ible for.    ** 
5d40: 70 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  popping the data
5d50: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e   from the stack.
5d60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5d70: 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 0a   SRT_Coroutine:.
5d80: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74      case SRT_Out
5d90: 70 75 74 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  put: {.      tes
5da0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
5db0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
5dc0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
5dd0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
5de0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
5df0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
5e00: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
5e10: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
5e20: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
5e30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5e40: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
5e50: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
5e60: 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20  lumn, r1);.     
5e70: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
5e80: 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  r(pParse, pOrder
5e90: 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20  By, p, r1);.    
5ea0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
5eb0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5ec0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , r1);.      }el
5ed0: 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  se if( eDest==SR
5ee0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
5ef0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5f00: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
5f10: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50 61  ield, pDest->iPa
5f20: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rm);.      }else
5f30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5f40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5f50: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67  P_ResultRow, reg
5f60: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29  Result, nColumn)
5f70: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5f80: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
5f90: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
5fa0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c   regResult, nCol
5fb0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  umn);.      }.  
5fc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5fd0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
5fe0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
5ff0: 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  ER).    /* Disca
6000: 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  rd the results. 
6010: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
6020: 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
6030: 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a  nts inside.    *
6040: 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  * the body of a 
6050: 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75  TRIGGER.  The pu
6060: 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65  rpose of such se
6070: 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c  lects is to call
6080: 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66  .    ** user-def
6090: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74  ined functions t
60a0: 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66  hat have side ef
60b0: 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f  fects.  We do no
60c0: 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62  t care.    ** ab
60d0: 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72  out the actual r
60e0: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
60f0: 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lect..    */.   
6100: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
6110: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
6120: 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a  =SRT_Discard );.
6130: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6140: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
6150: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
6160: 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
6170: 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
6180: 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70 74  reached.  Except
6190: 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20  , if.  ** there 
61a0: 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20  is a sorter, in 
61b0: 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 73  which case the s
61c0: 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61 64  orter has alread
61d0: 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74  y limited.  ** t
61e0: 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73  he output for us
61f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
6200: 64 65 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e 69  derBy==0 && p->i
6210: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
6220: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6230: 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e  , OP_IfZero, p->
6240: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20  iLimit, iBreak, 
6250: 2d 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  -1);.  }.}../*.*
6260: 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
6270: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65  ssion list, gene
6280: 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73  rate a KeyInfo s
6290: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
62a0: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c  cords.** the col
62b0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
62c0: 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  for each express
62d0: 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72  ion in that expr
62e0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
62f0: 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  ** If the ExprLi
6300: 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  st is an ORDER B
6310: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
6320: 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65  ause then the re
6330: 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e  sulting.** KeyIn
6340: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
6350: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
6360: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
6370: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a  irtual index to.
6380: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61  ** implement tha
6390: 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68  t clause.  If th
63a0: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68  e ExprList is th
63b0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
63c0: 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e  a SELECT.** then
63d0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
63e0: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
63f0: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
6400: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
6410: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70  .** index to imp
6420: 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43  lement a DISTINC
6430: 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70  T test..**.** Sp
6440: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
6450: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
6460: 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d  e is obtain from
6470: 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61   malloc.  The ca
6480: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
6490: 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
64a0: 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74   for seeing that
64b0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
64c0: 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  is eventually.**
64d0: 20 66 72 65 65 64 2e 20 20 41 64 64 20 74 68 65   freed.  Add the
64e0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
64f0: 72 65 20 74 6f 20 74 68 65 20 50 34 20 66 69 65  re to the P4 fie
6500: 6c 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20  ld of an opcode 
6510: 75 73 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49  using.** P4_KEYI
6520: 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74  NFO_HANDOFF is t
6530: 68 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20  he usual way of 
6540: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69  dealing with thi
6550: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  s..*/.static Key
6560: 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f  Info *keyInfoFro
6570: 6d 45 78 70 72 4c 69 73 74 28 50 61 72 73 65 20  mExprList(Parse 
6580: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73  *pParse, ExprLis
6590: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c  t *pList){.  sql
65a0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
65b0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78  e->db;.  int nEx
65c0: 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  pr;.  KeyInfo *p
65d0: 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45  Info;.  struct E
65e0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
65f0: 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  tem;.  int i;.. 
6600: 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e   nExpr = pList->
6610: 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d  nExpr;.  pInfo =
6620: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6630: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
6640: 2a 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a  *pInfo) + nExpr*
6650: 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
6660: 29 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49  )+1) );.  if( pI
6670: 6e 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f  nfo ){.    pInfo
6680: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
6690: 75 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c  u8*)&pInfo->aCol
66a0: 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49  l[nExpr];.    pI
66b0: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75  nfo->nField = (u
66c0: 31 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 70 49  16)nExpr;.    pI
66d0: 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64  nfo->enc = ENC(d
66e0: 62 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 64  b);.    pInfo->d
66f0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 66 6f 72 28  b = db;.    for(
6700: 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  i=0, pItem=pList
6710: 2d 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  ->a; i<nExpr; i+
6720: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
6730: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
6740: 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  l;.      pColl =
6750: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
6760: 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
6770: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
6780: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
6790: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64         pColl = d
67a0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
67b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66      }.      pInf
67c0: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  o->aColl[i] = pC
67d0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f  oll;.      pInfo
67e0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
67f0: 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  = pItem->sortOrd
6800: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  er;.    }.  }.  
6810: 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a  return pInfo;.}.
6820: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6830: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
6840: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20  LECT./*.** Name 
6850: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
6860: 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64  n operator, used
6870: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
6880: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ges..*/.static c
6890: 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63  onst char *selec
68a0: 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b  tOpName(int id){
68b0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77  .  char *z;.  sw
68c0: 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20  itch( id ){.    
68d0: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20  case TK_ALL:    
68e0: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c     z = "UNION AL
68f0: 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  L";   break;.   
6900: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
6910: 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45  CT: z = "INTERSE
6920: 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  CT";   break;.  
6930: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
6940: 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54  :    z = "EXCEPT
6950: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
6960: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
6970: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
6980: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
6990: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a    }.  return z;.
69a0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
69b0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
69c0: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e  _SELECT */..#ifn
69d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
69e0: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e  EXPLAIN./*.** Un
69f0: 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e  less an "EXPLAIN
6a00: 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d   QUERY PLAN" com
6a10: 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72  mand is being pr
6a20: 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75  ocessed, this fu
6a30: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e  nction.** is a n
6a40: 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
6a50: 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c   it adds a singl
6a60: 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20  e row of output 
6a70: 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c  to the EQP resul
6a80: 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20  t,.** where the 
6a90: 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68  caption is of th
6aa0: 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
6ab0: 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45  "USE TEMP B-TREE
6ac0: 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20   FOR xxx".**.** 
6ad0: 77 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65  where xxx is one
6ae0: 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20   of "DISTINCT", 
6af0: 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22 47  "ORDER BY" or "G
6b00: 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c  ROUP BY". Exactl
6b10: 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65  y which.** is de
6b20: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
6b30: 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e  zUsage argument.
6b40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6b50: 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
6b60: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6b70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61  const char *zUsa
6b80: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  ge){.  if( pPars
6b90: 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
6ba0: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
6bb0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
6bc0: 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73    char *zMsg = s
6bd0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
6be0: 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20 54  arse->db, "USE T
6bf0: 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25  EMP B-TREE FOR %
6c00: 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20 20  s", zUsage);.   
6c10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6c20: 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
6c30: 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
6c40: 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c  tId, 0, 0, zMsg,
6c50: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
6c60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  }.}../*.** Assig
6c70: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74  n expression b t
6c80: 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65  o lvalue a. A se
6c90: 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72  cond, no-op, ver
6ca0: 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63  sion of this mac
6cb0: 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65  ro.** is provide
6cc0: 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d  d when SQLITE_OM
6cd0: 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65  IT_EXPLAIN is de
6ce0: 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f  fined. This allo
6cf0: 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69  ws the code.** i
6d00: 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  n sqlite3Select(
6d10: 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75  ) to assign valu
6d20: 65 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 20  es to structure 
6d30: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
6d40: 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78   that.** only ex
6d50: 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d  ist if SQLITE_OM
6d60: 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f  IT_EXPLAIN is no
6d70: 74 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75  t defined withou
6d80: 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a  t polluting the.
6d90: 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69 66  ** code with #if
6da0: 6e 64 65 66 20 64 69 72 65 63 74 69 76 65 73 2e  ndef directives.
6db0: 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70  .*/.# define exp
6dc0: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61  lainSetInteger(a
6dd0: 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73  , b) a = b..#els
6de0: 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69  e./* No-op versi
6df0: 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61  ons of the expla
6e00: 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e  inXXX() function
6e10: 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f  s and macros. */
6e20: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
6e30: 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a  nTempTable(y,z).
6e40: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
6e50: 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a  SetInteger(y,z).
6e60: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
6e70: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6e80: 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64 65  _EXPLAIN) && !de
6e90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6ea0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
6eb0: 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  T)./*.** Unless 
6ec0: 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52  an "EXPLAIN QUER
6ed0: 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20  Y PLAN" command 
6ee0: 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  is being process
6ef0: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
6f00: 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  n.** is a no-op.
6f10: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61   Otherwise, it a
6f20: 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  dds a single row
6f30: 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68   of output to th
6f40: 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a  e EQP result,.**
6f50: 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69   where the capti
6f60: 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20  on is of one of 
6f70: 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a  the two forms:.*
6f80: 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54  *.**   "COMPOSIT
6f90: 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75  E SUBQUERIES iSu
6fa0: 62 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f 70  b1 and iSub2 (op
6fb0: 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49  )".**   "COMPOSI
6fc0: 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53  TE SUBQUERIES iS
6fd0: 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 55 53  ub1 and iSub2 US
6fe0: 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20  ING TEMP B-TREE 
6ff0: 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72  (op)".**.** wher
7000: 65 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62  e iSub1 and iSub
7010: 32 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65  2 are the intege
7020: 72 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  rs passed as the
7030: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
7040: 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d  * function param
7050: 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69 73  eters, and op is
7060: 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73   the text repres
7070: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
7080: 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20  parameter.** of 
7090: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54  the same name. T
70a0: 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f 70  he parameter "op
70b0: 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  " must be one of
70c0: 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
70d0: 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45  CEPT,.** TK_INTE
70e0: 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e  RSECT or TK_ALL.
70f0: 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20   The first form 
7100: 69 73 20 75 73 65 64 20 69 66 20 61 72 67 75 6d  is used if argum
7110: 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20 0a  ent bUseTmp is .
7120: 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68 65  ** false, or the
7130: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20   second form if 
7140: 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73  it is true..*/.s
7150: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
7160: 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50  inComposite(.  P
7170: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7190: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
71a0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71c0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
71d0: 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
71e0: 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74  PT etc. */.  int
71f0: 20 69 53 75 62 31 2c 20 20 20 20 20 20 20 20 20   iSub1,         
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7210: 53 75 62 71 75 65 72 79 20 69 64 20 31 20 2a 2f  Subquery id 1 */
7220: 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20 20  .  int iSub2,   
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7240: 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69     /* Subquery i
7250: 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73  d 2 */.  int bUs
7260: 65 54 6d 70 20 20 20 20 20 20 20 20 20 20 20 20  eTmp            
7270: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
7280: 20 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c 65   if a temp table
7290: 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a   was used */.){.
72a0: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
72b0: 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  _UNION || op==TK
72c0: 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54  _EXCEPT || op==T
72d0: 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f  K_INTERSECT || o
72e0: 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69  p==TK_ALL );.  i
72f0: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
7300: 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62  in==2 ){.    Vdb
7310: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
7320: 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Vdbe;.    char *
7330: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
7340: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70  rintf(.        p
7350: 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50  Parse->db, "COMP
7360: 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45 53 20  OUND SUBQUERIES 
7370: 25 64 20 41 4e 44 20 25 64 20 25 73 28 25 73 29  %d AND %d %s(%s)
7380: 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c  ", iSub1, iSub2,
7390: 0a 20 20 20 20 20 20 20 20 62 55 73 65 54 6d 70  .        bUseTmp
73a0: 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54  ?"USING TEMP B-T
73b0: 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63 74  REE ":"", select
73c0: 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20 29  OpName(op).    )
73d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
73e0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
73f0: 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
7400: 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
7410: 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
7420: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f  );.  }.}.#else./
7430: 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73  * No-op versions
7440: 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58   of the explainX
7450: 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61  XX() functions a
7460: 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20  nd macros. */.# 
7470: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f  define explainCo
7480: 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c  mposite(v,w,x,y,
7490: 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  z).#endif../*.**
74a0: 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   If the inner lo
74b0: 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  op was generated
74c0: 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c   using a non-nul
74d0: 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d  l pOrderBy argum
74e0: 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ent,.** then the
74f0: 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c   results were pl
7500: 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72  aced in a sorter
7510: 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f  .  After the loo
7520: 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a  p is terminated.
7530: 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75  ** we need to ru
7540: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64  n the sorter and
7550: 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75   output the resu
7560: 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  lts.  The follow
7570: 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  ing.** routine g
7580: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
7590: 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74  e needed to do t
75a0: 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  hat..*/.static v
75b0: 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74  oid generateSort
75c0: 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70  Tail(.  Parse *p
75d0: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
75e0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
75f0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
7600: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
7610: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
7620: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
7630: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
7640: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44  ode into this VD
7650: 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  BE */.  int nCol
7660: 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d  umn,      /* Num
7670: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f  ber of columns o
7680: 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  f data */.  Sele
7690: 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a  ctDest *pDest /*
76a0: 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65   Write the sorte
76b0: 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  d results here *
76c0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 42  /.){.  int addrB
76d0: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
76e0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
76f0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
7700: 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f   to exit loop */
7710: 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69  .  int addrConti
7720: 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
7730: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
7740: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72  /* Jump here for
7750: 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20   next cycle */. 
7760: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74   int addr;.  int
7770: 20 69 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65   iTab;.  int pse
7780: 75 64 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45 78  udoTab = 0;.  Ex
7790: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
77a0: 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
77b0: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
77c0: 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69  Dest->eDest;.  i
77d0: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
77e0: 2d 3e 69 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20  ->iParm;..  int 
77f0: 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65  regRow;.  int re
7800: 67 52 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62 20  gRowid;..  iTab 
7810: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  = pOrderBy->iECu
7820: 72 73 6f 72 3b 0a 20 20 72 65 67 52 6f 77 20 3d  rsor;.  regRow =
7830: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
7840: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  eg(pParse);.  if
7850: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
7860: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
7870: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
7880: 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70     pseudoTab = p
7890: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
78a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
78b0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
78c0: 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61 62  seudo, pseudoTab
78d0: 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d  , regRow, nColum
78e0: 6e 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 69 64  n);.    regRowid
78f0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
7900: 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71     regRowid = sq
7910: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
7920: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 69  pParse);.  }.  i
7930: 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
7940: 20 53 46 5f 55 73 65 53 6f 72 74 65 72 20 29 7b   SF_UseSorter ){
7950: 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f 72 74  .    int regSort
7960: 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Out = ++pParse->
7970: 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 70 74  nMem;.    int pt
7980: 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
7990: 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  ab++;.    sqlite
79a0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
79b0: 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 74  P_OpenPseudo, pt
79c0: 61 62 32 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  ab2, regSortOut,
79d0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
79e0: 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  +2);.    addr = 
79f0: 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
7a00: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
7a10: 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64  erSort, iTab, ad
7a20: 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 63 6f  drBreak);.    co
7a30: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 61  deOffset(v, p, a
7a40: 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  ddrContinue);.  
7a50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7a60: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
7a70: 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67 53  Data, iTab, regS
7a80: 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  ortOut);.    sql
7a90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7aa0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 74 61  , OP_Column, pta
7ab0: 62 32 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  b2, pOrderBy->nE
7ac0: 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29 3b 0a  xpr+1, regRow);.
7ad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
7ae0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
7af0: 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20  G_CLEARCACHE);. 
7b00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
7b10: 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
7b20: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
7b30: 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42  ort, iTab, addrB
7b40: 72 65 61 6b 29 3b 0a 20 20 20 20 63 6f 64 65 4f  reak);.    codeO
7b50: 66 66 73 65 74 28 76 2c 20 70 2c 20 61 64 64 72  ffset(v, p, addr
7b60: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
7b70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7b80: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
7b90: 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  Tab, pOrderBy->n
7ba0: 45 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29 3b  Expr+1, regRow);
7bb0: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65  .  }.  switch( e
7bc0: 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65  Dest ){.    case
7bd0: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
7be0: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
7bf0: 62 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  b: {.      testc
7c00: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
7c10: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74  Table );.      t
7c20: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
7c30: 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a  SRT_EphemTab );.
7c40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7c50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
7c60: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
7c70: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
7c80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7c90: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
7ca0: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72  iParm, regRow, r
7cb0: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
7cc0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7cd0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
7ce0: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65  PEND);.      bre
7cf0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
7d00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
7d10: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
7d20: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
7d30: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
7d40: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
7d50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
7d60: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
7d70: 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67 52   regRow, 1, regR
7d80: 6f 77 69 64 2c 20 26 70 2d 3e 61 66 66 69 6e 69  owid, &p->affini
7d90: 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ty, 1);.      sq
7da0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
7db0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
7dc0: 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29 3b  rse, regRow, 1);
7dd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7de0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7df0: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
7e00: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
7e10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7e20: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
7e30: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
7e40: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
7e50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
7e60: 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
7e70: 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c 20   regRow, iParm, 
7e80: 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  1);.      /* The
7e90: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
7ea0: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
7eb0: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
7ec0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7ed0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
7ee0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69  fault: {.      i
7ef0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65  nt i;.      asse
7f00: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  rt( eDest==SRT_O
7f10: 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d  utput || eDest==
7f20: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
7f30: 20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65   .      testcase
7f40: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
7f50: 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  put );.      tes
7f60: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
7f70: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
7f80: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7f90: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
7fa0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
7fb0: 65 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69 4d  egRow!=pDest->iM
7fc0: 65 6d 2b 69 20 29 3b 0a 20 20 20 20 20 20 20 20  em+i );.        
7fd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7fe0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
7ff0: 70 73 65 75 64 6f 54 61 62 2c 20 69 2c 20 70 44  pseudoTab, i, pD
8000: 65 73 74 2d 3e 69 4d 65 6d 2b 69 29 3b 0a 20 20  est->iMem+i);.  
8010: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29        if( i==0 )
8020: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
8030: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
8040: 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43  v, OPFLAG_CLEARC
8050: 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d  ACHE);.        }
8060: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8070: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
8080: 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tput ){.        
8090: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
80a0: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
80b0: 77 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20  w, pDest->iMem, 
80c0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
80d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
80e0: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
80f0: 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e  (pParse, pDest->
8100: 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  iMem, nColumn);.
8110: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8120: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8130: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
8140: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ld, pDest->iParm
8150: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8160: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8170: 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
8180: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
8190: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73 71 6c  , regRow);.  sql
81a0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
81b0: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
81c0: 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  wid);..  /* The 
81d0: 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
81e0: 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
81f0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
8200: 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  l(v, addrContinu
8210: 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  e);.  if( p->sel
8220: 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 53 6f  Flags & SF_UseSo
8230: 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rter ){.    sqli
8240: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8250: 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20   OP_SorterNext, 
8260: 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 7d  iTab, addr);.  }
8270: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
8280: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8290: 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
82a0: 64 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  dr);.  }.  sqlit
82b0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
82c0: 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  el(v, addrBreak)
82d0: 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  ;.  if( eDest==S
82e0: 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65  RT_Output || eDe
82f0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
8300: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
8310: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8320: 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54 61  _Close, pseudoTa
8330: 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b, 0);.  }.}../*
8340: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
8350: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
8360: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
8370: 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70  'declaration typ
8380: 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  e' of the.** exp
8390: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54  ression pExpr. T
83a0: 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65  he string may be
83b0: 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74   treated as stat
83c0: 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ic by the caller
83d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c  ..**.** The decl
83e0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20  aration type is 
83f0: 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79  the exact dataty
8400: 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78  pe definition ex
8410: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
8420: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45  .** original CRE
8430: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
8440: 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ent if the expre
8450: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
8460: 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72  n. The.** declar
8470: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
8480: 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20   ROWID field is 
8490: 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79  INTEGER. Exactly
84a0: 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73   when an express
84b0: 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  ion.** is consid
84c0: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61  ered a column ca
84d0: 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20  n be complex in 
84e0: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
84f0: 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a  subqueries. The.
8500: 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  ** result-set ex
8510: 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20  pression in all 
8520: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
8530: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
8540: 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64  ts is .** consid
8550: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79  ered a column by
8560: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
8570: 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
8580: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
8590: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
85a0: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
85b0: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
85c0: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29  CT col FROM tbl)
85d0: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62  ;.**   SELECT ab
85e0: 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63  c FROM (SELECT c
85f0: 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74  ol AS abc FROM t
8600: 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  bl);.** .** The 
8610: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
8620: 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73   for any express
8630: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ion other than a
8640: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e   column is NULL.
8650: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
8660: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
8670: 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  e(.  NameContext
8680: 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a   *pNC, .  Expr *
8690: 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63  pExpr,.  const c
86a0: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 44 62  har **pzOriginDb
86b0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
86c0: 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a 20 20  *pzOriginTab,.  
86d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
86e0: 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68  riginCol.){.  ch
86f0: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20  ar const *zType 
8700: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
8710: 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d 20 30  t *zOriginDb = 0
8720: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
8730: 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30 3b 0a  zOriginTab = 0;.
8740: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
8750: 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  riginCol = 0;.  
8760: 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 4e 45 56  int j;.  if( NEV
8770: 45 52 28 70 45 78 70 72 3d 3d 30 29 20 7c 7c 20  ER(pExpr==0) || 
8780: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30  pNC->pSrcList==0
8790: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
87a0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
87b0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
87c0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
87d0: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
87e0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
87f0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
8800: 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74  column. Locate t
8810: 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c  he table the col
8820: 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20  umn is being.   
8830: 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20     ** extracted 
8840: 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74  from in NameCont
8850: 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68  ext.pSrcList. Th
8860: 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20  is table may be 
8870: 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61  real.      ** da
8880: 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20  tabase table or 
8890: 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  a subquery..    
88a0: 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
88b0: 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
88c0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
88d0: 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e  structure column
88e0: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
88f0: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  om */.      Sele
8900: 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20  ct *pS = 0;     
8910: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
8920: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  t the column is 
8930: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
8940: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  /.      int iCol
8950: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
8960: 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20  n;  /* Index of 
8970: 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a  column in pTab *
8980: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
8990: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
89a0: 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
89b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
89c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
89d0: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  MN );.      whil
89e0: 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20  e( pNC && !pTab 
89f0: 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69  ){.        SrcLi
8a00: 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
8a10: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
8a20: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c        for(j=0;j<
8a30: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26  pTabList->nSrc &
8a40: 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  & pTabList->a[j]
8a50: 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d  .iCursor!=pExpr-
8a60: 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20  >iTable;j++);.  
8a70: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62        if( j<pTab
8a80: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20  List->nSrc ){.  
8a90: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
8aa0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
8ab0: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ab;.          pS
8ac0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
8ad0: 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ].pSelect;.     
8ae0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8af0: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
8b00: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
8b10: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
8b20: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
8b30: 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20        /* At one 
8b40: 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68 20  time, code such 
8b50: 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78  as "SELECT new.x
8b60: 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67  " within a trigg
8b70: 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20  er would.       
8b80: 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20 63   ** cause this c
8b90: 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e  ondition to run.
8ba0: 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77 65    Since then, we
8bb0: 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75 72   have restructur
8bc0: 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20 2a  ed how.        *
8bd0: 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20 69  * trigger code i
8be0: 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64 20  s generated and 
8bf0: 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  so this conditio
8c00: 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a  n is no longer .
8c10: 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69          ** possi
8c20: 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 74  ble. However, it
8c30: 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74 72   can still be tr
8c40: 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74  ue for statement
8c50: 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20 2a  s like.        *
8c60: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  * the following:
8c70: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
8c80: 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
8c90: 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54  TABLE t1(col INT
8ca0: 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20 2a  EGER);.        *
8cb0: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
8cc0: 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20  CT t1.col) FROM 
8cd0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20  FROM t1;.       
8ce0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   **.        ** w
8cf0: 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29  hen columnType()
8d00: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
8d10: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74 31  e expression "t1
8d20: 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20 20  .col" in the .  
8d30: 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c        ** sub-sel
8d40: 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ect. In this cas
8d50: 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75 6d  e, set the colum
8d60: 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20  n type to NULL, 
8d70: 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  even.        ** 
8d80: 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64  though it should
8d90: 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54 45   really be "INTE
8da0: 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a  GER"..        **
8db0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
8dc0: 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65   is not a proble
8dd0: 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e  m, as the column
8de0: 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c   type of "t1.col
8df0: 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20 20  " is never.     
8e00: 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e     ** used. When
8e10: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
8e20: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
8e30: 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20 20  xpression .     
8e40: 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20 74     ** "(SELECT t
8e50: 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72  1.col)", the cor
8e60: 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65 74  rect type is ret
8e70: 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20 54  urned (see the T
8e80: 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20  K_SELECT.       
8e90: 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f 77   ** branch below
8ea0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  .  */.        br
8eb0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
8ec0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
8ed0: 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62 3d   && pExpr->pTab=
8ee0: 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69  =pTab );.      i
8ef0: 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20  f( pS ){.       
8f00: 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20   /* The "table" 
8f10: 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75  is actually a su
8f20: 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69  b-select or a vi
8f30: 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ew in the FROM c
8f40: 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  lause.        **
8f50: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
8f60: 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e  tatement. Return
8f70: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
8f80: 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e   type and origin
8f90: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
8fa0: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d   for the result-
8fb0: 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  set column of th
8fc0: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20  e sub-select..  
8fd0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
8fe0: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
8ff0: 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53 2d 3e  ALWAYS(iCol<pS->
9000: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
9010: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
9020: 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74  f iCol is less t
9030: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
9040: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
9050: 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20  quests the.     
9060: 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66       ** rowid of
9070: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
9080: 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78  or view. This ex
9090: 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61  pression is lega
90a0: 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20  l (see .        
90b0: 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d    ** test case m
90c0: 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61  isc2.2.2) - it a
90d0: 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20  lways evaluates 
90e0: 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20  to NULL..       
90f0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
9100: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
9110: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
9120: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
9130: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a  >a[iCol].pExpr;.
9140: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53            sNC.pS
9150: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
9160: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  c;.          sNC
9170: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
9180: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72          sNC.pPar
9190: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
91a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  ;.          zTyp
91b0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
91c0: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e  sNC, p, &zOrigin
91d0: 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c  Db, &zOriginTab,
91e0: 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a   &zOriginCol); .
91f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9200: 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
9210: 28 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 20  (pTab->pSchema) 
9220: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
9230: 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  real table */.  
9240: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
9250: 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  S );.        if(
9260: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
9270: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
9280: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
9290: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
92a0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
92b0: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
92c0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
92d0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
92e0: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
92f0: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f         zOriginCo
9300: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
9310: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9320: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
9330: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
9340: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
9350: 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 70 54 61  zOriginCol = pTa
9360: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
9370: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ame;.        }. 
9380: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 54 61         zOriginTa
9390: 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  b = pTab->zName;
93a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43  .        if( pNC
93b0: 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20  ->pParse ){.    
93c0: 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
93d0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
93e0: 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65  ndex(pNC->pParse
93f0: 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
9400: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
9410: 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70 4e 43 2d  zOriginDb = pNC-
9420: 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62  >pParse->db->aDb
9430: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
9440: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9450: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9460: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
9470: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
9480: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
9490: 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  T: {.      /* Th
94a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
94b0: 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65  a sub-select. Re
94c0: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
94d0: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20  tion type and.  
94e0: 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e      ** origin in
94f0: 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c  fo for the singl
9500: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
9510: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
9520: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a  e SELECT.      *
9530: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  * statement..   
9540: 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65     */.      Name
9550: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
9560: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
9570: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
9580: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 20  ;.      Expr *p 
9590: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
95a0: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
95b0: 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
95c0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
95d0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
95e0: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
95f0: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
9600: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
9610: 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e   pNC;.      sNC.
9620: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
9630: 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70  arse;.      zTyp
9640: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
9650: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e  sNC, p, &zOrigin
9660: 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c  Db, &zOriginTab,
9670: 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a   &zOriginCol); .
9680: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9690: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
96a0: 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69 6e 44  .  if( pzOriginD
96b0: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
96c0: 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26 26 20   pzOriginTab && 
96d0: 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a 20  pzOriginCol );. 
96e0: 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20 3d     *pzOriginDb =
96f0: 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20 20   zOriginDb;.    
9700: 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 7a  *pzOriginTab = z
9710: 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20 20 2a  OriginTab;.    *
9720: 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f  pzOriginCol = zO
9730: 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20  riginCol;.  }.  
9740: 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a  return zType;.}.
9750: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
9760: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
9770: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
9780: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
9790: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
97a0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
97b0: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  et..*/.static vo
97c0: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
97d0: 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20  nTypes(.  Parse 
97e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
97f0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
9800: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
9810: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
9820: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
9830: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
9840: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
9850: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
9860: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
9870: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9880: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20  OMIT_DECLTYPE.  
9890: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
98a0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
98b0: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
98c0: 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  sNC;.  sNC.pSrcL
98d0: 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
98e0: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
98f0: 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30  Parse;.  for(i=0
9900: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
9910: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
9920: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
9930: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
9940: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
9950: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
9960: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
9970: 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74  TADATA.    const
9980: 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d   char *zOrigDb =
9990: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
99a0: 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  ar *zOrigTab = 0
99b0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
99c0: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
99d0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
99e0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
99f0: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
9a00: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b  Tab, &zOrigCol);
9a10: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62  ..    /* The vdb
9a20: 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20  e must make its 
9a30: 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20  own copy of the 
9a40: 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20  column-type and 
9a50: 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f  other .    ** co
9a60: 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74  lumn specific st
9a70: 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74  rings, in case t
9a80: 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73  he schema is res
9a90: 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20  et before this. 
9aa0: 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61     ** virtual ma
9ab0: 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64  chine is deleted
9ac0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
9ad0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
9ae0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
9af0: 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67  _DATABASE, zOrig
9b00: 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  Db, SQLITE_TRANS
9b10: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
9b20: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
9b30: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54  (v, i, COLNAME_T
9b40: 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20  ABLE, zOrigTab, 
9b50: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
9b60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
9b70: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
9b80: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d  i, COLNAME_COLUM
9b90: 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c  N, zOrigCol, SQL
9ba0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
9bb0: 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20  #else.    zType 
9bc0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
9bd0: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  C, p, 0, 0, 0);.
9be0: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
9bf0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
9c00: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44  (v, i, COLNAME_D
9c10: 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20  ECLTYPE, zType, 
9c20: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
9c30: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
9c40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
9c50: 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  LTYPE */.}../*.*
9c60: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
9c70: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
9c80: 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65  he VDBE the name
9c90: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
9ca0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
9cb0: 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  t.  This informa
9cc0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
9cd0: 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61  provide the.** a
9ce0: 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e  zCol[] values in
9cf0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a   the callback..*
9d00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
9d10: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
9d20: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
9d30: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
9d40: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
9d50: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
9d60: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
9d70: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
9d80: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
9d90: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
9da0: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
9db0: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  t set */.){.  Vd
9dc0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
9dd0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20  pVdbe;.  int i, 
9de0: 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  j;.  sqlite3 *db
9df0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
9e00: 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20   int fullNames, 
9e10: 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66  shortNames;..#if
9e20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9e30: 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66  _EXPLAIN.  /* If
9e40: 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c   this is an EXPL
9e50: 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73  AIN, skip this s
9e60: 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  tep */.  if( pPa
9e70: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
9e80: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
9e90: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50  #endif..  if( pP
9ea0: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
9eb0: 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30 29  t || NEVER(v==0)
9ec0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
9ed0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
9ee0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
9ef0: 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c  sSet = 1;.  full
9f00: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
9f10: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
9f20: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
9f30: 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62  shortNames = (db
9f40: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
9f50: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21  _ShortColNames)!
9f60: 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  =0;.  sqlite3Vdb
9f70: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70  eSetNumCols(v, p
9f80: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
9f90: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
9fa0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
9fb0: 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  .    Expr *p;.  
9fc0: 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b    p = pEList->a[
9fd0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
9fe0: 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
9ff0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
a000: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
a010: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Name ){.      ch
a020: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
a030: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
a040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a050: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
a060: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
a070: 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52  zName, SQLITE_TR
a080: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65  ANSIENT);.    }e
a090: 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d  lse if( (p->op==
a0a0: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e  TK_COLUMN || p->
a0b0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
a0c0: 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74 20 29  N) && pTabList )
a0d0: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
a0e0: 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20  Tab;.      char 
a0f0: 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74  *zCol;.      int
a100: 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75   iCol = p->iColu
a110: 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  mn;.      for(j=
a120: 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61 62  0; ALWAYS(j<pTab
a130: 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b  List->nSrc); j++
a140: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
a150: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
a160: 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65  ursor==p->iTable
a170: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
a180: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
a190: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
a1a0: 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   );.      pTab =
a1b0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
a1c0: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
a1d0: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
a1e0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
a1f0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
a200: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
a210: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
a220: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ol) );.      if(
a230: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
a240: 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64     zCol = "rowid
a250: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
a260: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70          zCol = p
a270: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
a280: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zName;.      }. 
a290: 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e       if( !shortN
a2a0: 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d  ames && !fullNam
a2b0: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  es ){.        sq
a2c0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
a2d0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
a2e0: 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20  E_NAME, .       
a2f0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74       sqlite3DbSt
a300: 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d  rDup(db, pEList-
a310: 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51  >a[i].zSpan), SQ
a320: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
a330: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
a340: 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ullNames ){.    
a350: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
a360: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  = 0;.        zNa
a370: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
a380: 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
a390: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43   pTab->zName, zC
a3a0: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
a3b0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
a3c0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
a3d0: 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51  _NAME, zName, SQ
a3e0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
a3f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a400: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
a410: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
a420: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43  COLNAME_NAME, zC
a430: 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ol, SQLITE_TRANS
a440: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20  IENT);.      }. 
a450: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a460: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
a470: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
a480: 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20  AME_NAME, .     
a490: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74       sqlite3DbSt
a4a0: 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d  rDup(db, pEList-
a4b0: 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51  >a[i].zSpan), SQ
a4c0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
a4d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72     }.  }.  gener
a4e0: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
a4f0: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
a500: 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a   pEList);.}../*.
a510: 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e 20 65 78  ** Given a an ex
a520: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77  pression list (w
a530: 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74  hich is really t
a540: 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65  he list of expre
a550: 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66  ssions.** that f
a560: 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73  orm the result s
a570: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  et of a SELECT s
a580: 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74  tatement) comput
a590: 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  e appropriate.**
a5a0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f   column names fo
a5b0: 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 77  r a table that w
a5c0: 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78  ould hold the ex
a5d0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
a5e0: 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20  *.** All column 
a5f0: 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e  names will be un
a600: 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ique..**.** Only
a610: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
a620: 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20  s are computed. 
a630: 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43   Column.zType, C
a640: 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20  olumn.zColl,.** 
a650: 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73  and other fields
a660: 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a   of Column are z
a670: 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  eroed..**.** Ret
a680: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
a690: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61 20   success.  If a 
a6a0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
a6b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a  n error occurs,.
a6c0: 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e  ** store NULL in
a6d0: 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e   *paCol and 0 in
a6e0: 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75   *pnCol and retu
a6f0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  rn SQLITE_NOMEM.
a700: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
a710: 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d  electColumnsFrom
a720: 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
a730: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
a740: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
a750: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
a760: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
a770: 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74      /* Expr list
a780: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64   from which to d
a790: 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  erive column nam
a7a0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43  es */.  int *pnC
a7b0: 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
a7c0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
a7d0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68  ber of columns h
a7e0: 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20  ere */.  Column 
a7f0: 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20  **paCol         
a800: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65   /* Write the ne
a810: 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65  w column list he
a820: 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  re */.){.  sqlit
a830: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
a840: 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61  >db;   /* Databa
a850: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
a860: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
a870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a880: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
a890: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20  */.  int cnt;   
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8b0: 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20   /* Index added 
a8c0: 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65  to make the name
a8d0: 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c   unique */.  Col
a8e0: 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c  umn *aCol, *pCol
a8f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ;        /* For 
a900: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73  looping over res
a910: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
a920: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
a930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a940: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
a950: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
a960: 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  set */.  Expr *p
a970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a980: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
a990: 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  on for a single 
a9a0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f  result column */
a9b0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a9d0: 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  * Column name */
a9e0: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aa00: 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69  * Size of name i
aa10: 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20  n zName[] */..  
aa20: 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d 20  *pnCol = nCol = 
aa30: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
aa40: 20 61 43 6f 6c 20 3d 20 2a 70 61 43 6f 6c 20 3d   aCol = *paCol =
aa50: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
aa60: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
aa70: 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a  aCol[0])*nCol);.
aa80: 20 20 69 66 28 20 61 43 6f 6c 3d 3d 30 20 29 20    if( aCol==0 ) 
aa90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
aaa0: 4d 45 4d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  MEM;.  for(i=0, 
aab0: 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f  pCol=aCol; i<nCo
aac0: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
aad0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61  .    /* Get an a
aae0: 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20  ppropriate name 
aaf0: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20  for the column. 
ab00: 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45     */.    p = pE
ab10: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
ab20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
ab30: 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 45 78  >pRight==0 || Ex
ab40: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2d  prHasProperty(p-
ab50: 3e 70 52 69 67 68 74 2c 20 45 50 5f 49 6e 74 56  >pRight, EP_IntV
ab60: 61 6c 75 65 29 0a 20 20 20 20 20 20 20 20 20 20  alue).          
ab70: 20 20 20 20 20 7c 7c 20 70 2d 3e 70 52 69 67 68       || p->pRigh
ab80: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30 20 7c  t->u.zToken==0 |
ab90: 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 75 2e 7a  | p->pRight->u.z
aba0: 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20  Token[0]!=0 );. 
abb0: 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20     if( (zName = 
abc0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
abd0: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
abe0: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
abf0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53   contains an "AS
ac00: 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c   <name>" phrase,
ac10: 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74   use <name> as t
ac20: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  he name */.     
ac30: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
ac40: 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61  DbStrDup(db, zNa
ac50: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
ac60: 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c        Expr *pCol
ac70: 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54 68  Expr = p;  /* Th
ac80: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
ac90: 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  t is the result 
aca0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
acb0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
acc0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ;         /* Tab
acd0: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
ace0: 74 68 20 74 68 69 73 20 65 78 70 72 65 73 73 69  th this expressi
acf0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  on */.      whil
ad00: 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  e( pColExpr->op=
ad10: 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20  =TK_DOT ){.     
ad20: 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43     pColExpr = pC
ad30: 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  olExpr->pRight;.
ad40: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ad50: 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20  pColExpr!=0 );. 
ad60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ad70: 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54   pColExpr->op==T
ad80: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41  K_COLUMN && ALWA
ad90: 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61  YS(pColExpr->pTa
ada0: 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  b!=0) ){.       
adb0: 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20   /* For columns 
adc0: 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  use the column n
add0: 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ame name */.    
ade0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
adf0: 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ColExpr->iColumn
ae00: 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  ;.        pTab =
ae10: 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 3b   pColExpr->pTab;
ae20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
ae30: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
ae40: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
ae50: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
ae60: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
ae70: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
ae80: 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54      iCol>=0 ? pT
ae90: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
aea0: 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 29 3b  Name : "rowid");
aeb0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
aec0: 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54   pColExpr->op==T
aed0: 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  K_ID ){.        
aee0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
aef0: 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70  Property(pColExp
af00: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
af10: 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  );.        zName
af20: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
af30: 66 28 64 62 2c 20 22 25 73 22 2c 20 70 43 6f 6c  f(db, "%s", pCol
af40: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
af50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
af60: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65        /* Use the
af70: 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f   original text o
af80: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70  f the column exp
af90: 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e  ression as its n
afa0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a  ame */.        z
afb0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
afc0: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20  rintf(db, "%s", 
afd0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
afe0: 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  an);.      }.   
aff0: 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
b000: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
b010: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
b020: 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
b030: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b040: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
b050: 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ure the column n
b060: 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20  ame is unique.  
b070: 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e  If the name is n
b080: 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a  ot unique,.    *
b090: 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67  * append a integ
b0a0: 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73  er to the name s
b0b0: 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65  o that it become
b0c0: 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f  s unique..    */
b0d0: 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  .    nName = sql
b0e0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
b0f0: 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63  me);.    for(j=c
b100: 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  nt=0; j<i; j++){
b110: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
b120: 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a  e3StrICmp(aCol[j
b130: 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
b140: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  =0 ){.        ch
b150: 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20  ar *zNewName;.  
b160: 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d        zName[nNam
b170: 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  e] = 0;.        
b180: 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74  zNewName = sqlit
b190: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
b1a0: 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b  s:%d", zName, ++
b1b0: 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  cnt);.        sq
b1c0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
b1d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
b1e0: 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65  zName = zNewName
b1f0: 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31  ;.        j = -1
b200: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  ;.        if( zN
b210: 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ame==0 ) break;.
b220: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b230: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
b240: 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28  zName;.  }.  if(
b250: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
b260: 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  d ){.    for(j=0
b270: 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
b280: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
b290: 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  (db, aCol[j].zNa
b2a0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  me);.    }.    s
b2b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
b2c0: 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43   aCol);.    *paC
b2d0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43  ol = 0;.    *pnC
b2e0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ol = 0;.    retu
b2f0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
b300: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
b310: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
b320: 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20 63  * Add type and c
b330: 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  ollation informa
b340: 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  tion to a column
b350: 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a   list based on.*
b360: 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  * a SELECT state
b370: 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65  ment..** .** The
b380: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65   column list pre
b390: 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72 6f  sumably came fro
b3a0: 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61  m selectColumnNa
b3b0: 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mesFromExprList(
b3c0: 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  )..** The column
b3d0: 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e   list has only n
b3e0: 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73 20  ames, not types 
b3f0: 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20  or collations.  
b400: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
b410: 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e 64  goes through and
b420: 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73 20   adds the types 
b430: 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a  and collations..
b440: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
b450: 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74  ne requires that
b460: 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73   all identifiers
b470: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a   in the SELECT.*
b480: 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72  * statement be r
b490: 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  esolved..*/.stat
b4a0: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64  ic void selectAd
b4b0: 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
b4c0: 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65  llation(.  Parse
b4d0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
b4e0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
b4f0: 65 78 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  exts */.  int nC
b500: 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
b510: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
b520: 75 6d 6e 73 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  umns */.  Column
b530: 20 2a 61 43 6f 6c 2c 20 20 20 20 20 20 20 20 20   *aCol,         
b540: 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
b550: 6e 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ns */.  Select *
b560: 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a  pSelect       /*
b570: 20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20   SELECT used to 
b580: 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20  determine types 
b590: 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a  and collations *
b5a0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
b5b0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
b5c0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
b5d0: 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  NC;.  Column *pC
b5e0: 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  ol;.  CollSeq *p
b5f0: 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Coll;.  int i;. 
b600: 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75   Expr *p;.  stru
b610: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
b620: 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *a;..  assert( 
b630: 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20  pSelect!=0 );.  
b640: 61 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74  assert( (pSelect
b650: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
b660: 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a  Resolved)!=0 );.
b670: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d    assert( nCol==
b680: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
b690: 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  >nExpr || db->ma
b6a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
b6b0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
b6c0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
b6d0: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
b6e0: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
b6f0: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
b700: 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
b710: 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45   a = pSelect->pE
b720: 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69  List->a;.  for(i
b730: 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69  =0, pCol=aCol; i
b740: 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  <nCol; i++, pCol
b750: 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69  ++){.    p = a[i
b760: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 43 6f  ].pExpr;.    pCo
b770: 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74  l->zType = sqlit
b780: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 63  e3DbStrDup(db, c
b790: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
b7a0: 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a 20 20  p, 0, 0, 0));.  
b7b0: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
b7c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
b7d0: 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 69  finity(p);.    i
b7e0: 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  f( pCol->affinit
b7f0: 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66  y==0 ) pCol->aff
b800: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
b810: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 70 43 6f  FF_NONE;.    pCo
b820: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
b830: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
b840: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  p);.    if( pCol
b850: 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  l ){.      pCol-
b860: 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >zColl = sqlite3
b870: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f  DbStrDup(db, pCo
b880: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
b890: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
b8a0: 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74  iven a SELECT st
b8b0: 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74  atement, generat
b8c0: 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  e a Table struct
b8d0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
b8e0: 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  es.** the result
b8f0: 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c   set of that SEL
b900: 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ECT..*/.Table *s
b910: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
b920: 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  fSelect(Parse *p
b930: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
b940: 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
b950: 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65   *pTab;.  sqlite
b960: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
b970: 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46  db;.  int savedF
b980: 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c  lags;..  savedFl
b990: 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b  ags = db->flags;
b9a0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
b9b0: 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e  ~SQLITE_FullColN
b9c0: 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  ames;.  db->flag
b9d0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72  s |= SQLITE_Shor
b9e0: 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c  tColNames;.  sql
b9f0: 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70  ite3SelectPrep(p
ba00: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
ba10: 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  0);.  if( pParse
ba20: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20  ->nErr ) return 
ba30: 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c  0;.  while( pSel
ba40: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53  ect->pPrior ) pS
ba50: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d  elect = pSelect-
ba60: 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66  >pPrior;.  db->f
ba70: 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67  lags = savedFlag
ba80: 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  s;.  pTab = sqli
ba90: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
baa0: 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
bab0: 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  ) );.  if( pTab=
bac0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
bad0: 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65   0;.  }.  /* The
bae0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
baf0: 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f  tOfSelect() is o
bb00: 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65  nly used n conte
bb10: 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73  xts where lookas
bb20: 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61  ide.  ** is disa
bb30: 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  bled */.  assert
bb40: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
bb50: 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20  bEnabled==0 );. 
bb60: 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b   pTab->nRef = 1;
bb70: 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d  .  pTab->zName =
bb80: 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77   0;.  pTab->nRow
bb90: 45 73 74 20 3d 20 31 30 30 30 30 30 30 3b 0a 20  Est = 1000000;. 
bba0: 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
bbb0: 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
bbc0: 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  e, pSelect->pELi
bbd0: 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
bbe0: 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
bbf0: 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
bc00: 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
bc10: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e  (pParse, pTab->n
bc20: 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c  Col, pTab->aCol,
bc30: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61   pSelect);.  pTa
bc40: 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
bc50: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
bc60: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
bc70: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
bc80: 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72  db, pTab);.    r
bc90: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
bca0: 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
bcb0: 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20  *.** Get a VDBE 
bcc0: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
bcd0: 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43  rser context.  C
bce0: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
bcf0: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
bd00: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
bd10: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
bd20: 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73   and leave a mes
bd30: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
bd40: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  */.Vdbe *sqlite3
bd50: 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70  GetVdbe(Parse *p
bd60: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
bd70: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
bd80: 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  e;.  if( v==0 ){
bd90: 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d  .    v = pParse-
bda0: 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33  >pVdbe = sqlite3
bdb0: 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73  VdbeCreate(pPars
bdc0: 65 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65 66 20  e->db);.#ifndef 
bdd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
bde0: 45 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20  E.    if( v ){. 
bdf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
be00: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61  AddOp0(v, OP_Tra
be10: 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ce);.    }.#endi
be20: 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76  f.  }.  return v
be30: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ;.}.../*.** Comp
be40: 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61  ute the iLimit a
be50: 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64  nd iOffset field
be60: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
be70: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
be80: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
be90: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  et expressions. 
bea0: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
beb0: 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70  set hold the exp
bec0: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
bed0: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f   appear in the o
bee0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
bef0: 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20  ement after the 
bf00: 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
bf10: 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f  .** keywords.  O
bf20: 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20  r NULL if those 
bf30: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69  keywords are omi
bf40: 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64  tted. iLimit and
bf50: 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65   iOffset .** are
bf60: 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d   the integer mem
bf70: 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ory register num
bf80: 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72  bers for counter
bf90: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  s used to comput
bfa0: 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20  e .** the limit 
bfb0: 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20  and offset.  If 
bfc0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69  there is no limi
bfd0: 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c  t and/or offset,
bfe0: 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74   then .** iLimit
bff0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65   and iOffset are
c000: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
c010: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
c020: 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73  anges the values
c030: 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69   of iLimit and i
c040: 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a  Offset only if.*
c050: 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66  * a limit or off
c060: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
c070: 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  y pLimit and pOf
c080: 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e  fset.  iLimit an
c090: 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f  d.** iOffset sho
c0a0: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72  uld have been pr
c0b0: 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69  eset to appropri
c0c0: 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ate default valu
c0d0: 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62  es.** (usually b
c0e0: 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31  ut not always -1
c0f0: 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  ) prior to calli
c100: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
c110: 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d  .** Only if pLim
c120: 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74  it!=0 or pOffset
c130: 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
c140: 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
c150: 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
c160: 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
c170: 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
c180: 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
c190: 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
c1a0: 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
c1b0: 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
c1c0: 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
c1d0: 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
c1e0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
c1f0: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
c200: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
c210: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
c220: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
c230: 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
c240: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
c250: 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
c260: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64  ffset;.  int add
c270: 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  r1, n;.  if( p->
c280: 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b  iLimit ) return;
c290: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49  ..  /* .  ** "LI
c2a0: 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73  MIT -1" always s
c2b0: 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20  hows all rows.  
c2c0: 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20  There is some.  
c2d0: 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79 20 61  ** contraversy a
c2e0: 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f  bout what the co
c2f0: 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73  rrect behavior s
c300: 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54  hould be..  ** T
c310: 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
c320: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70  mentation interp
c330: 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74  rets "LIMIT 0" t
c340: 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72  o mean.  ** no r
c350: 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ows..  */.  sqli
c360: 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
c370: 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  r(pParse);.  ass
c380: 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
c390: 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21  =0 || p->pLimit!
c3a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
c3b0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e  Limit ){.    p->
c3c0: 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20  iLimit = iLimit 
c3d0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
c3e0: 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ;.    v = sqlite
c3f0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
c400: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
c410: 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20  v==0) ) return; 
c420: 20 2f 2a 20 56 44 42 45 20 73 68 6f 75 6c 64 20   /* VDBE should 
c430: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
c440: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
c450: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
c460: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
c470: 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20  Limit, &n) ){.  
c480: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c490: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
c4a0: 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b  ger, n, iLimit);
c4b0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
c4c0: 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
c4d0: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
c4e0: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
c4f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c500: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
c510: 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , 0, iBreak);.  
c520: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c530: 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
c540: 74 52 6f 77 20 3e 20 28 64 6f 75 62 6c 65 29 6e  tRow > (double)n
c550: 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
c560: 20 3d 20 28 64 6f 75 62 6c 65 29 6e 3b 0a 20 20   = (double)n;.  
c570: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
c580: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
c590: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
c5a0: 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74  ->pLimit, iLimit
c5b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c5c0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
c5d0: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d  _MustBeInt, iLim
c5e0: 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  it);.      VdbeC
c5f0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
c600: 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
c610: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c620: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp2(v, OP_IfZe
c630: 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65  ro, iLimit, iBre
c640: 61 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ak);.    }.    i
c650: 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b  f( p->pOffset ){
c660: 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
c670: 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b  t = iOffset = ++
c680: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
c690: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
c6a0: 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  ++;   /* Allocat
c6b0: 65 20 61 6e 20 65 78 74 72 61 20 72 65 67 69 73  e an extra regis
c6c0: 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66  ter for limit+of
c6d0: 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 73 71  fset */.      sq
c6e0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
c6f0: 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74  arse, p->pOffset
c700: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
c710: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c720: 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
c730: 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  Int, iOffset);. 
c740: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
c750: 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75  ((v, "OFFSET cou
c760: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 61  nter"));.      a
c770: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
c780: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
c790: 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b 0a  fPos, iOffset);.
c7a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c7b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
c7c0: 74 65 67 65 72 2c 20 30 2c 20 69 4f 66 66 73 65  teger, 0, iOffse
c7d0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
c7e0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
c7f0: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20 73   addr1);.      s
c800: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c810: 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d  (v, OP_Add, iLim
c820: 69 74 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66  it, iOffset, iOf
c830: 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 56  fset+1);.      V
c840: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
c850: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b  LIMIT+OFFSET"));
c860: 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73  .      addr1 = s
c870: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c880: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c  (v, OP_IfPos, iL
c890: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  imit);.      sql
c8a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
c8b0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31  , OP_Integer, -1
c8c0: 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20  , iOffset+1);.  
c8d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
c8e0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
c8f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
c900: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c910: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
c920: 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ECT./*.** Return
c930: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
c940: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
c950: 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  nce for the iCol
c960: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  -th column of.**
c970: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
c980: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
c990: 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e  -select statemen
c9a0: 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e  t "p".  Return N
c9b0: 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ULL if.** the co
c9c0: 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61  lumn has no defa
c9d0: 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ult collating se
c9e0: 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
c9f0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
ca00: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  ence for the com
ca10: 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20  pound select is 
ca20: 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a  taken from the.*
ca30: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  * left-most term
ca40: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74   of the select t
ca50: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  hat has a collat
ca60: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ing sequence..*/
ca70: 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
ca80: 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c  *multiSelectColl
ca90: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
caa0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
cab0: 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53  t iCol){.  CollS
cac0: 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  eq *pRet;.  if( 
cad0: 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
cae0: 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
caf0: 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
cb00: 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
cb10: 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol);.  }else{.  
cb20: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
cb30: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
cb40: 30 20 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d  0 );.  if( pRet=
cb50: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45  =0 && iCol<p->pE
cb60: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
cb70: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
cb80: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
cb90: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
cba0: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a  a[iCol].pExpr);.
cbb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
cbc0: 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t;.}.#endif /* S
cbd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
cbe0: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f  UND_SELECT */../
cbf0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
cc00: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
cc10: 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
cc20: 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
cc30: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
cc40: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
cc50: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
cc60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cc70: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
cc80: 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
cc90: 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
cca0: 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
ccb0: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
ccc0: 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
ccd0: 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e 64 65 66   */.);...#ifndef
cce0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
ccf0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
cd00: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
cd10: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
cd20: 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  cess a compound 
cd30: 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a  query form from.
cd40: 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  ** two or more s
cd50: 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20  eparate queries 
cd60: 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49  using UNION, UNI
cd70: 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20  ON ALL, EXCEPT, 
cd80: 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a  or.** INTERSECT.
cd90: 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
cda0: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
cdb0: 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
cdc0: 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
cdd0: 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
cde0: 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
cdf0: 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
ce00: 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
ce10: 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
ce20: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
ce30: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
ce40: 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
ce50: 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
ce60: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
ce70: 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
ce80: 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
ce90: 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
cea0: 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
ceb0: 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
cec0: 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
ced0: 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
cee0: 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
cef0: 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
cf00: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
cf10: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
cf20: 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
cf30: 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
cf40: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
cf50: 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
cf60: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
cf70: 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
cf80: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
cf90: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
cfa0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
cfb0: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
cfc0: 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
cfd0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
cff0: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
d000: 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
d010: 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
d020: 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
d030: 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
d040: 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
d050: 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
d060: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
d070: 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
d080: 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
d090: 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
d0a0: 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
d0b0: 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
d0c0: 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
d0d0: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
d0e0: 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
d0f0: 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
d100: 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
d110: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
d120: 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
d130: 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
d140: 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
d150: 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
d160: 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
d170: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
d180: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
d190: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
d1a0: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
d1b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
d1c0: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
d1d0: 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
d1e0: 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
d1f0: 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
d200: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
d210: 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
d220: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
d230: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
d240: 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
d250: 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
d260: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
d270: 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
d280: 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
d290: 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
d2a0: 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
d2b0: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
d2c0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
d2d0: 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
d2e0: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
d2f0: 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c  dest;      /* Al
d300: 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64  ternative data d
d310: 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
d320: 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20  Select *pDelete 
d330: 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f  = 0;  /* Chain o
d340: 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73  f simple selects
d350: 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
d360: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
d370: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
d380: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
d390: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d3a0: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e  MIT_EXPLAIN.  in
d3b0: 74 20 69 53 75 62 31 3b 20 20 20 20 20 20 20 20  t iSub1;        
d3c0: 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
d3d0: 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79   left-hand query
d3e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b   */.  int iSub2;
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
d400: 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68  QP id of right-h
d410: 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e  and query */.#en
d420: 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  dif..  /* Make s
d430: 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ure there is no 
d440: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
d450: 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f  T clause on prio
d460: 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79  r SELECTs.  Only
d470: 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28  .  ** the last (
d480: 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45  right-most) SELE
d490: 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73  CT in the series
d4a0: 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44   may have an ORD
d4b0: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a  ER BY or LIMIT..
d4c0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
d4d0: 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b   && p->pPrior );
d4e0: 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e    /* Calling fun
d4f0: 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73  ction guarantees
d500: 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20   this much */.  
d510: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d520: 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
d530: 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
d540: 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d   pPrior->pRightm
d550: 6f 73 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20  ost!=pPrior );. 
d560: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
d570: 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e  >pRightmost==p->
d580: 70 52 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20  pRightmost );.  
d590: 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20  dest = *pDest;. 
d5a0: 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72   if( pPrior->pOr
d5b0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
d5c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
d5d0: 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c  rse,"ORDER BY cl
d5e0: 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
d5f0: 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65   after %s not be
d600: 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c  fore",.      sel
d610: 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
d620: 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
d630: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
d640: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
d650: 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  if( pPrior->pLim
d660: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
d670: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d680: 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73  ,"LIMIT clause s
d690: 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
d6a0: 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
d6b0: 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
d6c0: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
d6d0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
d6e0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
d6f0: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73  nd;.  }..  v = s
d700: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
d710: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
d720: 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65   v!=0 );  /* The
d730: 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 63 72   VDBE already cr
d740: 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  eated by calling
d750: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20   function */..  
d760: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65  /* Create the de
d770: 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72  stination tempor
d780: 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63  ary table if nec
d790: 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66  essary.  */.  if
d7a0: 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
d7b0: 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
d7c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
d7d0: 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ist );.    sqlit
d7e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d7f0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
d800: 2c 20 64 65 73 74 2e 69 50 61 72 6d 2c 20 70 2d  , dest.iParm, p-
d810: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
d820: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d830: 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45  ChangeP5(v, BTRE
d840: 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20  E_UNORDERED);.  
d850: 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
d860: 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20  RT_Table;.  }.. 
d870: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c   /* Make sure al
d880: 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65  l SELECTs in the
d890: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20   statement have 
d8a0: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
d8b0: 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a  of elements.  **
d8c0: 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74   in their result
d8d0: 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73   sets..  */.  as
d8e0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
d8f0: 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  && pPrior->pELis
d900: 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45  t );.  if( p->pE
d910: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72  List->nExpr!=pPr
d920: 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ior->pEList->nEx
d930: 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  pr ){.    if( p-
d940: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56  >selFlags & SF_V
d950: 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 20 20 73  alues ){.      s
d960: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d970: 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55  Parse, "all VALU
d980: 45 53 20 6d 75 73 74 20 68 61 76 65 20 74 68 65  ES must have the
d990: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
d9a0: 74 65 72 6d 73 22 29 3b 0a 20 20 20 20 7d 65 6c  terms");.    }el
d9b0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
d9c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d9d0: 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68  , "SELECTs to th
d9e0: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
d9f0: 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 20 20   of %s".        
da00: 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68  " do not have th
da10: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
da20: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22   result columns"
da30: 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
da40: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ->op));.    }.  
da50: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
da60: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
da70: 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  end;.  }..  /* C
da80: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20  ompound SELECTs 
da90: 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44  that have an ORD
daa0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
dab0: 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74   handled separat
dac0: 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ely..  */.  if( 
dad0: 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
dae0: 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53     return multiS
daf0: 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61  electOrderBy(pPa
db00: 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a  rse, p, pDest);.
db10: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
db20: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
db30: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53  left and right S
db40: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
db50: 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  ..  */.  switch(
db60: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
db70: 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20  se TK_ALL: {.   
db80: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b     int addr = 0;
db90: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69  .      int nLimi
dba0: 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
dbb0: 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74   !pPrior->pLimit
dbc0: 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72   );.      pPrior
dbd0: 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c  ->pLimit = p->pL
dbe0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69  imit;.      pPri
dbf0: 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d  or->pOffset = p-
dc00: 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
dc10: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
dc20: 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
dc30: 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
dc40: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
dc50: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
dc60: 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29  , pPrior, &dest)
dc70: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
dc80: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
dc90: 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
dca0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
dcb0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
dcc0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
dcd0: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
dce0: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
dcf0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f  ->iLimit = pPrio
dd00: 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r->iLimit;.     
dd10: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50   p->iOffset = pP
dd20: 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  rior->iOffset;. 
dd30: 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d       if( p->iLim
dd40: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64  it ){.        ad
dd50: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
dd60: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a  AddOp1(v, OP_IfZ
dd70: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b  ero, p->iLimit);
dd80: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
dd90: 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61  ment((v, "Jump a
dda0: 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65  head if LIMIT re
ddb0: 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ached"));.      
ddc0: 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  }.      explainS
ddd0: 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
dde0: 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
ddf0: 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
de00: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
de10: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
de20: 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
de30: 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
de40: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  OK );.      pDel
de50: 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
de60: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
de70: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
de80: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b   p->nSelectRow +
de90: 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
dea0: 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20  tRow;.      if( 
deb0: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20  pPrior->pLimit. 
dec0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
ded0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 50  ExprIsInteger(pP
dee0: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e  rior->pLimit, &n
def0: 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26 26  Limit).       &&
df00: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e   p->nSelectRow >
df10: 20 28 64 6f 75 62 6c 65 29 6e 4c 69 6d 69 74 20   (double)nLimit 
df20: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
df30: 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
df40: 3d 20 28 64 6f 75 62 6c 65 29 6e 4c 69 6d 69 74  = (double)nLimit
df50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
df60: 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20  if( addr ){.    
df70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
df80: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
df90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
dfa0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
dfb0: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
dfc0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49  .    case TK_UNI
dfd0: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ON: {.      int 
dfe0: 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20  unionTab;    /* 
dff0: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
e000: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
e010: 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73  able holding res
e020: 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ult */.      u8 
e030: 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  op = 0;       /*
e040: 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f   One of the SRT_
e050: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61   operations to a
e060: 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a  pply to self */.
e070: 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f        int priorO
e080: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52  p;     /* The SR
e090: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  T_ operation to 
e0a0: 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73  apply to prior s
e0b0: 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20  elects */.      
e0c0: 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
e0d0: 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64  Offset; /* Saved
e0e0: 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c   values of p->nL
e0f0: 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66  imit and p->nOff
e100: 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  set */.      int
e110: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
e120: 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73  ectDest uniondes
e130: 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61  t;..      testca
e140: 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  se( p->op==TK_EX
e150: 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65  CEPT );.      te
e160: 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
e170: 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20  K_UNION );.     
e180: 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55   priorOp = SRT_U
e190: 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  nion;.      if( 
e1a0: 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f  dest.eDest==prio
e1b0: 72 4f 70 20 26 26 20 41 4c 57 41 59 53 28 21 70  rOp && ALWAYS(!p
e1c0: 2d 3e 70 4c 69 6d 69 74 20 26 26 21 70 2d 3e 70  ->pLimit &&!p->p
e1d0: 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 20  Offset) ){.     
e1e0: 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
e1f0: 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
e200: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
e210: 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
e220: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
e230: 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
e240: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e250: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 20  ->pRightmost!=p 
e260: 29 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20  );  /* Can only 
e270: 68 61 70 70 65 6e 20 66 6f 72 20 6c 65 66 74 77  happen for leftw
e280: 61 72 64 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20  ard elements.   
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2b0: 20 20 2a 2a 20 6f 66 20 61 20 33 2d 77 61 79 20    ** of a 3-way 
e2c0: 6f 72 20 6d 6f 72 65 20 63 6f 6d 70 6f 75 6e 64  or more compound
e2d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
e2e0: 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  rt( p->pLimit==0
e2f0: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20   );      /* Not 
e300: 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
e310: 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
e320: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e330: 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
e340: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
e350: 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
e360: 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
e370: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64      unionTab = d
e380: 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20  est.iParm;.     
e390: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e3a0: 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20  /* We will need 
e3b0: 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77  to create our ow
e3c0: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
e3d0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20  e to hold the.  
e3e0: 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65        ** interme
e3f0: 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20  diate results.. 
e400: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
e410: 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61    unionTab = pPa
e420: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
e430: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
e440: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
e450: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
e460: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e470: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
e480: 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  ral, unionTab, 0
e490: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
e4a0: 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
e4b0: 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
e4c0: 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70         p->addrOp
e4d0: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72  enEphm[0] = addr
e4e0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69  ;.        p->pRi
e4f0: 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67  ghtmost->selFlag
e500: 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
e510: 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61  meral;.        a
e520: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
e530: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
e540: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
e550: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
e560: 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20   to our left.   
e570: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
e580: 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72  rt( !pPrior->pOr
e590: 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73  derBy );.      s
e5a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
e5b0: 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c  Init(&uniondest,
e5c0: 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54   priorOp, unionT
e5d0: 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  ab);.      expla
e5e0: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
e5f0: 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
e600: 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
e610: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
e620: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
e630: 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  ior, &uniondest)
e640: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
e650: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
e660: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
e670: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
e680: 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
e690: 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
e6a0: 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
e6b0: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
e6c0: 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20  K_EXCEPT ){.    
e6d0: 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63      op = SRT_Exc
e6e0: 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ept;.      }else
e6f0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
e700: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
e710: 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  N );.        op 
e720: 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
e730: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
e740: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
e750: 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
e760: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
e770: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
e780: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
e790: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
e7a0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
e7b0: 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74   uniondest.eDest
e7c0: 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70   = op;.      exp
e7d0: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
e7e0: 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
e7f0: 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
e800: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e810: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
e820: 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
e830: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
e840: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
e850: 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66        /* Query f
e860: 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c  lattening in sql
e870: 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67  ite3Select() mig
e880: 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72  ht refill p->pOr
e890: 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20  derBy..      ** 
e8a0: 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74  Be sure to delet
e8b0: 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74  e p->pOrderBy, t
e8c0: 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f  herefore, to avo
e8d0: 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  id a memory leak
e8e0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
e8f0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
e900: 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
e910: 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
e920: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
e930: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
e940: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
e950: 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
e960: 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
e970: 54 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53  TK_UNION ) p->nS
e980: 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69  electRow += pPri
e990: 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
e9a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e9b0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
e9c0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
e9d0: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
e9e0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
e9f0: 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
ea00: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
ea10: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  0;.      p->iOff
ea20: 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  set = 0;..      
ea30: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64  /* Convert the d
ea40: 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  ata in the tempo
ea50: 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20  rary table into 
ea60: 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20  whatever form.  
ea70: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61      ** it is tha
ea80: 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e  t we currently n
ea90: 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eed..      */.  
eaa0: 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f      assert( unio
eab0: 6e 54 61 62 3d 3d 64 65 73 74 2e 69 50 61 72 6d  nTab==dest.iParm
eac0: 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d   || dest.eDest!=
ead0: 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20  priorOp );.     
eae0: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21   if( dest.eDest!
eaf0: 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
eb00: 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
eb10: 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
eb20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
eb30: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
eb40: 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
eb50: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
eb60: 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  {.          Sele
eb70: 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
eb80: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
eb90: 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
eba0: 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
ebb0: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  t->pPrior;.     
ebc0: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
ebd0: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
ebe0: 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
ebf0: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
ec00: 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20         iBreak = 
ec10: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
ec20: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
ec30: 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
ec40: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
ec50: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
ec60: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
ec70: 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
ec80: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
ec90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
eca0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f   OP_Rewind, unio
ecb0: 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20  nTab, iBreak);. 
ecc0: 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
ecd0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
ece0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
ecf0: 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
ed00: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
ed10: 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61  >pEList, unionTa
ed20: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  b, p->pEList->nE
ed30: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
ed40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
ed50: 2d 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74  -1, &dest, iCont
ed60: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
ed70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
ed80: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
ed90: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
eda0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
edb0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
edc0: 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20  nTab, iStart);. 
edd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ede0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
edf0: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
ee00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ee10: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
ee20: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
ee30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
ee40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
ee50: 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20  efault: assert( 
ee60: 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  p->op==TK_INTERS
ee70: 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 69  ECT ); {.      i
ee80: 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20  nt tab1, tab2;. 
ee90: 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
eea0: 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
eeb0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
eec0: 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20  it, *pOffset;.  
eed0: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
eee0: 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 69      SelectDest i
eef0: 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20  ntersectdest;.  
ef00: 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20      int r1;..   
ef10: 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20     /* INTERSECT 
ef20: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
ef30: 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e  m the others sin
ef40: 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20  ce it requires. 
ef50: 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70       ** two temp
ef60: 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48  orary tables.  H
ef70: 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20  ence it has its 
ef80: 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e  own case.  Begin
ef90: 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c  .      ** by all
efa0: 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c  ocating the tabl
efb0: 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e  es we will need.
efc0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
efd0: 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
efe0: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62  Tab++;.      tab
eff0: 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  2 = pParse->nTab
f000: 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
f010: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
f020: 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20   );..      addr 
f030: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f040: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
f050: 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30  hemeral, tab1, 0
f060: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
f070: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
f080: 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
f090: 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
f0a0: 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[0] = addr;.  
f0b0: 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73      p->pRightmos
f0c0: 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  t->selFlags |= S
f0d0: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
f0e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f0f0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20  ->pEList );..   
f100: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
f110: 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65  ELECTs to our le
f120: 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  ft into temporar
f130: 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a  y table "tab1"..
f140: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
f150: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
f160: 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64  Init(&intersectd
f170: 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  est, SRT_Union, 
f180: 74 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70  tab1);.      exp
f190: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
f1a0: 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
f1b0: 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
f1c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f1d0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
f1e0: 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63  Prior, &intersec
f1f0: 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  tdest);.      if
f200: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
f210: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
f220: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
f230: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
f240: 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
f250: 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
f260: 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
f270: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
f280: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f290: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
f2a0: 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20  phemeral, tab2, 
f2b0: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
f2c0: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
f2d0: 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[1] == -1 );.  
f2e0: 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
f2f0: 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[1] = addr;. 
f300: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
f310: 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
f320: 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
f330: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
f340: 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
f350: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
f360: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
f370: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72  = 0;.      inter
f380: 73 65 63 74 64 65 73 74 2e 69 50 61 72 6d 20 3d  sectdest.iParm =
f390: 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78 70   tab2;.      exp
f3a0: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
f3b0: 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
f3c0: 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
f3d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f3e0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
f3f0: 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
f400: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f410: 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
f420: 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74   );.      pDelet
f430: 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
f440: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
f450: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
f460: 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
f470: 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74  >pPrior->nSelect
f480: 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  Row ) p->nSelect
f490: 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  Row = pPrior->nS
f4a0: 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
f4b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
f4c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
f4d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
f4e0: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
f4f0: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
f500: 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f  Offset;..      /
f510: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
f520: 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
f530: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
f540: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
f550: 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
f560: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
f570: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
f580: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  );.      if( des
f590: 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  t.eDest==SRT_Out
f5a0: 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 53  put ){.        S
f5b0: 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
f5c0: 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  p;.        while
f5d0: 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
f5e0: 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
f5f0: 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
f600: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
f610: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
f620: 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  0, pFirst->pELis
f630: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
f640: 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
f650: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
f660: 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20  v);.      iCont 
f670: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
f680: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
f690: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
f6a0: 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
f6b0: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
f6c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f6d0: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
f6e0: 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a   tab1, iBreak);.
f6f0: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
f700: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
f710: 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61  rse);.      iSta
f720: 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
f730: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
f740: 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a  Key, tab1, r1);.
f750: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f760: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
f770: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c  _NotFound, tab2,
f780: 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 0a   iCont, r1, 0);.
f790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
f7a0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
f7b0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  se, r1);.      s
f7c0: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
f7d0: 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
f7e0: 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45  ist, tab1, p->pE
f7f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f810: 20 20 20 30 2c 20 2d 31 2c 20 26 64 65 73 74 2c     0, -1, &dest,
f820: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b   iCont, iBreak);
f830: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f840: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
f850: 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
f860: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f870: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61  2(v, OP_Next, ta
f880: 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  b1, iStart);.   
f890: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
f8a0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
f8b0: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
f8c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f8d0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
f8e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
f8f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f900: 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
f910: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
f920: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65  ;.    }.  }..  e
f930: 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
f940: 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69  pParse, p->op, i
f950: 53 75 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e  Sub1, iSub2, p->
f960: 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20  op!=TK_ALL);..  
f970: 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
f980: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
f990: 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d  sed by .  ** tem
f9a0: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
f9b0: 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
f9c0: 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
f9d0: 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
f9e0: 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
f9f0: 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
fa00: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
fa10: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
fa20: 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20   section is run 
fa30: 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  by the right-mos
fa40: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
fa50: 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45  nt only..  ** SE
fa60: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
fa70: 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61  to the left alwa
fa80: 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  ys skip this par
fa90: 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  t.  The right-mo
faa0: 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d  st.  ** SELECT m
fab0: 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74  ight also skip t
fac0: 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68  his part if it h
fad0: 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  as no ORDER BY c
fae0: 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e  lause and.  ** n
faf0: 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72  o temp tables ar
fb00: 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  e required..  */
fb10: 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
fb20: 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65  gs & SF_UsesEphe
fb30: 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  meral ){.    int
fb40: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
fb50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
fb60: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
fb70: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
fb80: 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
fb90: 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
fba0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65  uence for the re
fbb0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20  sult set */.    
fbc0: 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20  Select *pLoop;  
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fbe0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
fbf0: 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74  ough SELECT stat
fc00: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f  ements */.    Co
fc10: 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
fc30: 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
fc40: 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
fc50: 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ll[] */.    int 
fc60: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
fc70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
fc80: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
fc90: 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
fca0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
fcb0: 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b  pRightmost==p );
fcc0: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70  .    nCol = p->p
fcd0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
fce0: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
fcf0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
fd00: 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  (db,.           
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
fd20: 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43  of(*pKeyInfo)+nC
fd30: 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  ol*(sizeof(CollS
fd40: 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20 20 20  eq*) + 1));.    
fd50: 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b  if( !pKeyInfo ){
fd60: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
fd70: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
fd80: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
fd90: 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  t_end;.    }..  
fda0: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20    pKeyInfo->enc 
fdb0: 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70  = ENC(db);.    p
fdc0: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
fdd0: 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 0a 20 20  = (u16)nCol;..  
fde0: 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c    for(i=0, apCol
fdf0: 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  l=pKeyInfo->aCol
fe00: 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
fe10: 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20  apColl++){.     
fe20: 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69   *apColl = multi
fe30: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
fe40: 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20  arse, p, i);.   
fe50: 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c     if( 0==*apCol
fe60: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70  l ){.        *ap
fe70: 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
fe80: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
fe90: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f    }..    for(pLo
fea0: 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f  op=p; pLoop; pLo
feb0: 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72  op=pLoop->pPrior
fec0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
fed0: 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
fee0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
fef0: 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
ff00: 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  phm[i];.        
ff10: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
ff20: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30          /* If [0
ff30: 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e  ] is unused then
ff40: 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75   [1] is also unu
ff50: 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a  sed.  So we can.
ff60: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77            ** alw
ff70: 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74  ays safely abort
ff80: 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20   as soon as the 
ff90: 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f  first unused slo
ffa0: 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  t is found */.  
ffb0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ffc0: 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
ffd0: 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20  phm[1]<0 );.    
ffe0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
10000 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
10010 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c  P2(v, addr, nCol
10020 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10030 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
10040 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70  , addr, (char*)p
10050 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
10060 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  NFO);.        pL
10070 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
10080 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20  m[i] = -1;.     
10090 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
100a0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
100b0 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d  KeyInfo);.  }..m
100c0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a  ulti_select_end:
100d0 0a 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d  .  pDest->iMem =
100e0 20 64 65 73 74 2e 69 4d 65 6d 3b 0a 20 20 70 44   dest.iMem;.  pD
100f0 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 64 65 73 74  est->nMem = dest
10100 2e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  .nMem;.  sqlite3
10110 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
10120 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74   pDelete);.  ret
10130 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
10140 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10150 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
10160 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  */../*.** Code a
10170 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  n output subrout
10180 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74  ine for a corout
10190 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ine implementati
101a0 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43  on of a.** SELEC
101b0 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a  T statment..**.*
101c0 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65  * The data to be
101d0 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61   output is conta
101e0 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 4d 65  ined in pIn->iMe
101f0 6d 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a  m.  There are.**
10200 20 70 49 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c 75 6d   pIn->nMem colum
10210 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e  ns to be output.
10220 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65    pDest is where
10230 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75   the output shou
10240 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a  ld.** be sent..*
10250 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69  *.** regReturn i
10260 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
10270 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c  the register hol
10280 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74  ding the subrout
10290 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64  ine.** return ad
102a0 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  dress..**.** If 
102b0 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69  regPrev>0 then i
102c0 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72  t is the first r
102d0 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63  egister in a vec
102e0 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f  tor that.** reco
102f0 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  rds the previous
10300 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65   output.  mem[re
10310 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67  gPrev] is a flag
10320 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a   that is false.*
10330 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62  * if there has b
10340 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20  een no previous 
10350 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50  output.  If regP
10360 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20  rev>0 then code 
10370 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  is.** generated 
10380 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c  to suppress dupl
10390 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66  icates.  pKeyInf
103a0 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f  o is used for co
103b0 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e  mparing.** keys.
103c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49  .**.** If the LI
103d0 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e  MIT found in p->
103e0 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65  iLimit is reache
103f0 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  d, jump immediat
10400 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b  ely to.** iBreak
10410 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10420 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
10430 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73  broutine(.  Pars
10440 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
10450 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
10460 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
10470 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
10480 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
10490 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
104a0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e   SelectDest *pIn
104b0 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f  ,        /* Coro
104c0 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20  utine supplying 
104d0 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
104e0 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
104f0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65    /* Where to se
10500 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20  nd the data */. 
10510 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20   int regReturn, 
10520 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10530 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  return address r
10540 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
10550 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20   regPrev,       
10560 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
10570 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
10580 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73  .  No uniqueness
10590 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e   if 0 */.  KeyIn
105a0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
105b0 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72     /* For compar
105c0 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75  ing with previou
105d0 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74  s entry */.  int
105e0 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20 20   p4type,        
105f0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 34 20 74       /* The p4 t
10600 79 70 65 20 66 6f 72 20 70 4b 65 79 49 6e 66 6f  ype for pKeyInfo
10610 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
10620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10630 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77 65   Jump here if we
10640 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a   hit the LIMIT *
10650 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
10660 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
10670 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b    int iContinue;
10680 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20  .  int addr;..  
10690 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
106a0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
106b0 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  ;.  iContinue = 
106c0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
106d0 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53  abel(v);..  /* S
106e0 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74  uppress duplicat
106f0 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58  es for UNION, EX
10700 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
10710 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ECT .  */.  if( 
10720 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69  regPrev ){.    i
10730 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a  nt j1, j2;.    j
10740 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
10750 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
10760 74 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20  t, regPrev);.   
10770 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
10780 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
10790 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d  mpare, pIn->iMem
107a0 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
107b0 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20  ->nMem,.        
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107d0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
107e0 79 49 6e 66 6f 2c 20 70 34 74 79 70 65 29 3b 0a  yInfo, p4type);.
107f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10800 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
10810 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75  , j2+2, iContinu
10820 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20 73 71  e, j2+2);.    sq
10830 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
10840 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71  e(v, j1);.    sq
10850 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
10860 79 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  y(pParse, pIn->i
10870 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  Mem, regPrev+1, 
10880 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  pIn->nMem);.    
10890 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
108a0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
108b0 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   1, regPrev);.  
108c0 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
108d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
108e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
108f0 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20  /* Suppress the 
10900 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
10910 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72   entries if ther
10920 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63  e is an OFFSET c
10930 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64  lause.  */.  cod
10940 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43  eOffset(v, p, iC
10950 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69  ontinue);..  swi
10960 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73  tch( pDest->eDes
10970 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72  t ){.    /* Stor
10980 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
10990 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
109a0 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
109b0 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
109c0 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
109d0 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
109e0 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
109f0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
10a00 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
10a10 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
10a20 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
10a30 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
10a40 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
10a50 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  RT_Table );.    
10a60 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 73    testcase( pDes
10a70 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
10a80 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20  hemTab );.      
10a90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10aa0 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
10ab0 72 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70  rd, pIn->iMem, p
10ac0 49 6e 2d 3e 6e 4d 65 6d 2c 20 72 31 29 3b 0a 20  In->nMem, r1);. 
10ad0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10ae0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
10af0 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 50  Rowid, pDest->iP
10b00 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  arm, r2);.      
10b10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10b20 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
10b30 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72 31  pDest->iParm, r1
10b40 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
10b50 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
10b60 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
10b70 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D);.      sqlite
10b80 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
10b90 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
10ba0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
10bb0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
10bc0 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
10bd0 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
10be0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
10bf0 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
10c00 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
10c10 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
10c20 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
10c30 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
10c40 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
10c50 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
10c60 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
10c70 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
10c80 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
10c90 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
10ca0 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
10cb0 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
10cc0 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
10cd0 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20       int r1;.   
10ce0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e     assert( pIn->
10cf0 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20  nMem==1 );.     
10d00 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 0a   p->affinity = .
10d10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10d20 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
10d30 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
10d40 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66  pExpr, pDest->af
10d50 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20 72  finity);.      r
10d60 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
10d70 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
10d80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10d90 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
10da0 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d  eRecord, pIn->iM
10db0 65 6d 2c 20 31 2c 20 72 31 2c 20 26 70 2d 3e 61  em, 1, r1, &p->a
10dc0 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
10dd0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
10de0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
10df0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
10e00 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  Mem, 1);.      s
10e10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10e20 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
10e30 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20  , pDest->iParm, 
10e40 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
10e50 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
10e60 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
10e70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10e80 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65 76 65  ..#if 0  /* Neve
10e90 72 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f  r occurs on an O
10ea0 52 44 45 52 20 42 59 20 71 75 65 72 79 20 2a 2f  RDER BY query */
10eb0 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72  .    /* If any r
10ec0 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  ow exist in the 
10ed0 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f  result set, reco
10ee0 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64  rd that fact and
10ef0 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20   abort..    */. 
10f00 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73     case SRT_Exis
10f10 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts: {.      sqli
10f20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10f30 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
10f40 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20  pDest->iParm);. 
10f50 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
10f60 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
10f70 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
10f80 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
10f90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
10fa0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
10fb0 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
10fc0 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
10fd0 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
10fe0 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
10ff0 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
11000 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
11010 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
11020 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75  ell and break ou
11030 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
11040 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
11050 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  /.    case SRT_M
11060 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
11070 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31  rt( pIn->nMem==1
11080 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
11090 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
110a0 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c  arse, pIn->iMem,
110b0 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 31   pDest->iParm, 1
110c0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
110d0 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
110e0 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
110f0 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
11100 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11110 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
11120 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11130 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
11140 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
11150 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
11160 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
11170 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73  gisters.    ** s
11180 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73 74  tarting at pDest
11190 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 6e 20 74 68  ->iMem.  Then th
111a0 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65  e co-routine yie
111b0 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lds..    */.    
111c0 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
111d0 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ne: {.      if( 
111e0 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29  pDest->iMem==0 )
111f0 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  {.        pDest-
11200 3e 69 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 47  >iMem = sqlite3G
11210 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
11220 73 65 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a  se, pIn->nMem);.
11230 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e          pDest->n
11240 4d 65 6d 20 3d 20 70 49 6e 2d 3e 6e 4d 65 6d 3b  Mem = pIn->nMem;
11250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
11260 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
11270 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
11280 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69 4d 65  iMem, pDest->iMe
11290 6d 2c 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 29 3b  m, pDest->nMem);
112a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
112b0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
112c0 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 50 61  ield, pDest->iPa
112d0 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rm);.      break
112e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
112f0 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61  If none of the a
11300 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72  bove, then the r
11310 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f  esult destinatio
11320 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a  n must be.    **
11330 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68   SRT_Output.  Th
11340 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
11350 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ver called with 
11360 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  any other.    **
11370 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68   destination oth
11380 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73  er than the ones
11390 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f   handled above o
113a0 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20  r SRT_Output..  
113b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20    **.    ** For 
113c0 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75  SRT_Output, resu
113d0 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  lts are stored i
113e0 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  n a sequence of 
113f0 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20  registers.  .   
11400 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f   ** Then the OP_
11410 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65  ResultRow opcode
11420 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73   is used to caus
11430 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
11440 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72   to.    ** retur
11450 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f  n the next row o
11460 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f  f result..    */
11470 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
11480 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
11490 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
114a0 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
114b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
114c0 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
114d0 77 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49  w, pIn->iMem, pI
114e0 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20  n->nMem);.      
114f0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
11500 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
11510 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d  Parse, pIn->iMem
11520 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  , pIn->nMem);.  
11530 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11540 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
11550 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
11560 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
11570 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a  MIT is reached..
11580 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
11590 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
115a0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
115b0 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69   OP_IfZero, p->i
115c0 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d  Limit, iBreak, -
115d0 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  1);.  }..  /* Ge
115e0 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f  nerate the subro
115f0 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a  utine return.  *
11600 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
11610 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
11620 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c  Continue);.  sql
11630 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
11640 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
11650 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75  Return);..  retu
11660 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
11670 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * Alternative co
11680 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f  mpound select co
11690 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72  de generator for
116a0 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72   cases when ther
116b0 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52  e.** is an ORDER
116c0 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   BY clause..**.*
116d0 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75  * We assume a qu
116e0 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ery of the follo
116f0 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  wing form:.**.**
11700 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20        <selectA> 
11710 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65   <operator>  <se
11720 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59  lectB>  ORDER BY
11730 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a   <orderbylist>.*
11740 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20  *.** <operator> 
11750 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20  is one of UNION 
11760 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45  ALL, UNION, EXCE
11770 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
11780 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69  .  The idea.** i
11790 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c  s to code both <
117a0 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65  selectA> and <se
117b0 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20  lectB> with the 
117c0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
117d0 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65  as.** co-routine
117e0 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65  s.  Then run the
117f0 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20   co-routines in 
11800 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72  parallel and mer
11810 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  ge the results.*
11820 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  * into the outpu
11830 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  t.  In addition 
11840 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  to the two corou
11850 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65  tines (called se
11860 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c  lectA and.** sel
11870 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20  ectB) there are 
11880 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a  7 subroutines:.*
11890 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20  *.**    outA:   
118a0 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
118b0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20   of the selectA 
118c0 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
118d0 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
118e0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
118f0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a  compound query..
11900 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20  **.**    outB:  
11910 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
11920 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42  t of the selectB
11930 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
11940 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
11950 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
11960 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
11970 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65    (Only generate
11980 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a  d for UNION and.
11990 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
119a0 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50  NION ALL.  EXCEP
119b0 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54  T and INSERTSECT
119c0 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20   never output a 
119d0 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  row that.**     
119e0 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20          appears 
119f0 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a  only in B.).**.*
11a00 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61  *    AltB:    Ca
11a10 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
11a20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
11a30 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
11a40 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41   A<B..**.**    A
11a50 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  eqB:    Called w
11a60 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
11a70 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
11a80 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e  utines and A==B.
11a90 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  .**.**    AgtB: 
11aa0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
11ab0 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
11ac0 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
11ad0 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a  s and A>B..**.**
11ae0 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c      EofA:    Cal
11af0 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
11b00 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
11b10 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20  selectA..**.**  
11b20 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65    EofB:    Calle
11b30 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
11b40 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
11b50 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lectB..**.** The
11b60 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
11b70 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69  of the latter fi
11b80 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64  ve subroutines d
11b90 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a  epend on which .
11ba0 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
11bb0 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20   used:.**.**.** 
11bc0 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
11bd0 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e  N ALL         UN
11be0 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45  ION            E
11bf0 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49  XCEPT          I
11c00 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20  NTERSECT.**     
11c10 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
11c20 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
11c30 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
11c40 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
11c50 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c  --------.**   Al
11c60 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  tB:   outA, next
11c70 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
11c80 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
11c90 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
11ca0 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a  tA.**.**   AeqB:
11cb0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
11cc0 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
11cd0 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
11ce0 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
11cf0 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a  tA.**.**   AgtB:
11d00 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
11d10 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
11d20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20           nextB  
11d30 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a            nextB.
11d40 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20  **.**   EofA:   
11d50 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
11d60 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
11d70 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20        halt      
11d80 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
11d90 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41  *   EofB:   outA
11da0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
11db0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
11dc0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
11dd0 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e     halt.**.** In
11de0 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c   the AltB, AeqB,
11df0 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75   and AgtB subrou
11e00 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e  tines, an EOF on
11e10 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   A following nex
11e20 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20  tA.** causes an 
11e30 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
11e40 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f  o EofA and an EO
11e50 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67  F on B following
11e60 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a   nextB causes.**
11e70 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
11e80 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74  mp to EofB.  Wit
11e90 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  hin EofA and Eof
11ea0 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e  B, and EOF on en
11eb0 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  try or.** follow
11ec0 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73  ing nextX causes
11ed0 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65   a jump to the e
11ee0 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  nd of the select
11ef0 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
11f00 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d  ** Duplicate rem
11f10 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f  oval in the UNIO
11f20 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
11f30 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69  NTERSECT cases i
11f40 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74  s handled.** wit
11f50 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73  hin the output s
11f60 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
11f70 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72  regPrev register
11f80 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70   set holds the p
11f90 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74  reviously.** out
11fa0 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f  put value.  A co
11fb0 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
11fc0 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61   against this va
11fd0 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70  lue and the outp
11fe0 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64  ut.** is skipped
11ff0 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73   if the next res
12000 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68  ults would be th
12010 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72  e same as the pr
12020 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  evious..**.** Th
12030 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
12040 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c   plan is to impl
12050 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f  ement the two co
12060 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76  routines and sev
12070 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  en.** subroutine
12080 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75  s first, then pu
12090 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f  t the control lo
120a0 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f  gic at the botto
120b0 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  m.  Like this:.*
120c0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f  *.**          go
120d0 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63  to Init.**     c
120e0 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oA: coroutine fo
120f0 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29  r left query (A)
12100 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72  .**     coB: cor
12110 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
12120 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20   query (B).**   
12130 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e   outA: output on
12140 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20  e row of A.**   
12150 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e   outB: output on
12160 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f  e row of B (UNIO
12170 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20  N and UNION ALL 
12180 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41  only).**    EofA
12190 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42  : ....**    EofB
121a0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42  : ....**    AltB
121b0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42  : ....**    AeqB
121c0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42  : ....**    AgtB
121d0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74  : ....**    Init
121e0 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72  : initialize cor
121f0 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
12200 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
12210 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20  ld coA.**       
12220 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74     if eof(A) got
12230 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20  o EofA.**       
12240 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20     yield coB.** 
12250 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
12260 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20  B) goto EofB.** 
12270 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65     Cmpr: Compare
12280 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20   A, B.**        
12290 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71    Jump AltB, Aeq
122a0 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45  B, AgtB.**     E
122b0 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65  nd: ....**.** We
122c0 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42   call AltB, AeqB
122d0 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e  , AgtB, EofA, an
122e0 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69  d EofB "subrouti
122f0 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72  nes" but they ar
12300 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c  e not.** actuall
12310 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47  y called using G
12320 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f  osub and they do
12330 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f   not Return.  Eo
12340 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70  fA and EofB loop
12350 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61  .** until all da
12360 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
12370 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
12380 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c   "end" labe.  Al
12390 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64  tB, AeqB,.** and
123a0 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69   AgtB jump to ei
123b0 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e  ther L2 or to on
123c0 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66  e of EofA or Eof
123d0 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  B..*/.#ifndef SQ
123e0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
123f0 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63  ND_SELECT.static
12400 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
12410 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
12420 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
12430 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
12440 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
12450 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
12460 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
12470 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
12480 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
12490 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
124a0 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
124b0 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
124c0 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
124d0 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
124e0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
124f0 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  rs */.  Select *
12500 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
12510 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
12520 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
12530 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
12540 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
12550 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
12560 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
12570 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
12580 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44   destA;     /* D
12590 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
125a0 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20  oroutine A */.  
125b0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42  SelectDest destB
125c0 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
125d0 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
125e0 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ne B */.  int re
125f0 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20  gAddrA;         
12600 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
12610 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
12620 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
12630 69 6e 74 20 72 65 67 45 6f 66 41 3b 20 20 20 20  int regEofA;    
12640 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f        /* Flag to
12650 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73   indicate when s
12660 65 6c 65 63 74 2d 41 20 69 73 20 63 6f 6d 70 6c  elect-A is compl
12670 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ete */.  int reg
12680 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f  AddrB;         /
12690 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
126a0 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20  er for select-B 
126b0 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
126c0 6e 74 20 72 65 67 45 6f 66 42 3b 20 20 20 20 20  nt regEofB;     
126d0 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20       /* Flag to 
126e0 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73 65  indicate when se
126f0 6c 65 63 74 2d 42 20 69 73 20 63 6f 6d 70 6c 65  lect-B is comple
12700 74 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  te */.  int addr
12710 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a  SelectA;      /*
12720 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
12730 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69  select-A corouti
12740 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
12750 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a  SelectB;      /*
12760 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
12770 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69  select-B corouti
12780 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ne */.  int regO
12790 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  utA;          /*
127a0 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
127b0 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  r for the output
127c0 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -A subroutine */
127d0 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20  .  int regOutB; 
127e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
127f0 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
12800 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
12810 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
12820 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20  t addrOutA;     
12830 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
12840 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73  f the output-A s
12850 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
12860 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b  nt addrOutB = 0;
12870 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
12880 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20  of the output-B 
12890 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
128a0 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20  int addrEofA;   
128b0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
128c0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
128d0 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
128e0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
128f0 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20  ddrEofB;        
12900 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
12910 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61  he select-B-exha
12920 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
12930 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c   */.  int addrAl
12940 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tB;         /* A
12950 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c  ddress of the A<
12960 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
12970 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20    int addrAeqB; 
12980 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
12990 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73  ss of the A==B s
129a0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
129b0 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20  nt addrAgtB;    
129c0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
129d0 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f  of the A>B subro
129e0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
129f0 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20  egLimitA;       
12a00 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
12a10 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
12a20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
12a30 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tB;        /* Li
12a40 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
12a50 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
12a60 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
12a70 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20       /* A range 
12a80 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
12a90 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75  hold previous ou
12aa0 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  tput */.  int sa
12ab0 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  vedLimit;       
12ac0 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
12ad0 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20  f p->iLimit */. 
12ae0 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74   int savedOffset
12af0 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20  ;      /* Saved 
12b00 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66  value of p->iOff
12b10 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  set */.  int lab
12b20 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f  elCmpr;        /
12b30 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  * Label for the 
12b40 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72  start of the mer
12b50 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  ge algorithm */.
12b60 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20    int labelEnd; 
12b70 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
12b80 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
12b90 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45  the overall SELE
12ba0 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74  CT stmt */.  int
12bb0 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   j1;            
12bc0 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72     /* Jump instr
12bd0 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74  uctions that get
12be0 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a   retargetted */.
12bf0 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
12c00 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
12c10 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49  f TK_ALL, TK_UNI
12c20 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54  ON, TK_EXCEPT, T
12c30 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20  K_INTERSECT */. 
12c40 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75   KeyInfo *pKeyDu
12c50 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72  p = 0; /* Compar
12c60 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
12c70 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72   for duplicate r
12c80 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49  emoval */.  KeyI
12c90 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20  nfo *pKeyMerge; 
12ca0 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
12cb0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
12cc0 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a  merging rows */.
12cd0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
12ce0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
12cf0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
12d00 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
12d10 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
12d20 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
12d30 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
12d40 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
12d50 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
12d60 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
12d70 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  lause */.  int *
12d80 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20  aPermute;       
12d90 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
12da0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
12db0 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  to result set co
12dc0 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66  lumns */.#ifndef
12dd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
12de0 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31  LAIN.  int iSub1
12df0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
12e00 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68  EQP id of left-h
12e10 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  and query */.  i
12e20 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20  nt iSub2;       
12e30 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
12e40 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65  f right-hand que
12e50 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ry */.#endif..  
12e60 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
12e70 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rBy!=0 );.  asse
12e80 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29  rt( pKeyDup==0 )
12e90 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63  ; /* "Managed" c
12ea0 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20  ode needs this. 
12eb0 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a   Ticket #3382. *
12ec0 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
12ed0 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  >db;.  v = pPars
12ee0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
12ef0 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
12f00 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72    /* Already thr
12f10 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66  own the error if
12f20 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c   VDBE alloc fail
12f30 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64  ed */.  labelEnd
12f40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
12f50 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61  keLabel(v);.  la
12f60 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65  belCmpr = sqlite
12f70 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
12f80 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20  );...  /* Patch 
12f90 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  up the ORDER BY 
12fa0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70  clause.  */.  op
12fb0 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50   = p->op;  .  pP
12fc0 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
12fd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
12fe0 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  or->pOrderBy==0 
12ff0 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
13000 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61  p->pOrderBy;.  a
13010 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20  ssert( pOrderBy 
13020 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  );.  nOrderBy = 
13030 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
13040 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61  ..  /* For opera
13050 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20  tors other than 
13060 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76  UNION ALL we hav
13070 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
13080 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44  hat.  ** the ORD
13090 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76  ER BY clause cov
130a0 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f  ers every term o
130b0 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
130c0 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d  .  Add.  ** term
130d0 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  s to the ORDER B
130e0 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65  Y clause as nece
130f0 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ssary..  */.  if
13100 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op!=TK_ALL ){.
13110 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d      for(i=1; db-
13120 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
13130 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74   && i<=p->pEList
13140 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
13150 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
13160 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
13170 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  ;.      for(j=0,
13180 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
13190 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; j<nOrderBy; 
131a0 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
131b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
131c0 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f  Item->iOrderByCo
131d0 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
131e0 66 28 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72  f( pItem->iOrder
131f0 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b  ByCol==i ) break
13200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13210 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20  if( j==nOrderBy 
13220 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
13230 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
13240 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  xpr(db, TK_INTEG
13250 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ER, 0);.        
13260 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
13270 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13280 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
13290 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
132a0 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
132b0 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
132c0 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  i;.        pOrde
132d0 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
132e0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
132f0 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e  se, pOrderBy, pN
13300 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  ew);.        pOr
13310 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42  derBy->a[nOrderB
13320 79 2b 2b 5d 2e 69 4f 72 64 65 72 42 79 43 6f 6c  y++].iOrderByCol
13330 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20   = (u16)i;.     
13340 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
13350 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
13360 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74  omparison permut
13370 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66  ation and keyinf
13380 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77  o that is used w
13390 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72  ith.  ** the per
133a0 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f  mutation used to
133b0 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
133c0 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20  e next.  ** row 
133d0 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73  of results comes
133e0 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72   from selectA or
133f0 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20   selectB.  Also 
13400 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a  add explicit.  *
13410 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20  * collations to 
13420 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
13430 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61  use terms so tha
13440 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75  t when the subqu
13450 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68  eries.  ** to th
13460 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20  e right and the 
13470 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74  left are evaluat
13480 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65  ed, they use the
13490 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f   correct.  ** co
134a0 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  llation..  */.  
134b0 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74  aPermute = sqlit
134c0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
134d0 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f  , sizeof(int)*nO
134e0 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61  rderBy);.  if( a
134f0 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73  Permute ){.    s
13500 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
13510 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
13520 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
13530 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f  OrderBy->a; i<nO
13540 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74  rderBy; i++, pIt
13550 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  em++){.      ass
13560 65 72 74 28 20 70 49 74 65 6d 2d 3e 69 4f 72 64  ert( pItem->iOrd
13570 65 72 42 79 43 6f 6c 3e 30 20 20 26 26 20 70 49  erByCol>0  && pI
13580 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c  tem->iOrderByCol
13590 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <=p->pEList->nEx
135a0 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72  pr );.      aPer
135b0 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d  mute[i] = pItem-
135c0 3e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31  >iOrderByCol - 1
135d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79  ;.    }.    pKey
135e0 4d 65 72 67 65 20 3d 0a 20 20 20 20 20 20 73 71  Merge =.      sq
135f0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
13600 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4b 65  (db, sizeof(*pKe
13610 79 4d 65 72 67 65 29 2b 6e 4f 72 64 65 72 42 79  yMerge)+nOrderBy
13620 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
13630 2a 29 2b 31 29 29 3b 0a 20 20 20 20 69 66 28 20  *)+1));.    if( 
13640 70 4b 65 79 4d 65 72 67 65 20 29 7b 0a 20 20 20  pKeyMerge ){.   
13650 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53     pKeyMerge->aS
13660 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
13670 26 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c  &pKeyMerge->aCol
13680 6c 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20  l[nOrderBy];.   
13690 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 6e 46     pKeyMerge->nF
136a0 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 4f 72 64  ield = (u16)nOrd
136b0 65 72 42 79 3b 0a 20 20 20 20 20 20 70 4b 65 79  erBy;.      pKey
136c0 4d 65 72 67 65 2d 3e 65 6e 63 20 3d 20 45 4e 43  Merge->enc = ENC
136d0 28 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  (db);.      for(
136e0 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
136f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43   i++){.        C
13700 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
13710 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65         Expr *pTe
13720 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  rm = pOrderBy->a
13730 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
13740 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
13750 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c  ags & EP_ExpColl
13760 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ate ){.         
13770 20 70 43 6f 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e   pColl = pTerm->
13780 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d  pColl;.        }
13790 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
137a0 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
137b0 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
137c0 65 2c 20 70 2c 20 61 50 65 72 6d 75 74 65 5b 69  e, p, aPermute[i
137d0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54  ]);.          pT
137e0 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  erm->flags |= EP
137f0 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  _ExpCollate;.   
13800 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 43         pTerm->pC
13810 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  oll = pColl;.   
13820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
13830 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b  KeyMerge->aColl[
13840 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
13850 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61      pKeyMerge->a
13860 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
13870 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
13880 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d  rtOrder;.      }
13890 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
138a0 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
138b0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  0;.  }..  /* Rea
138c0 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  ttach the ORDER 
138d0 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  BY clause to the
138e0 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
138f0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
13900 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d  derBy;.  pPrior-
13910 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
13920 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
13930 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65  Parse->db, pOrde
13940 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41  rBy, 0);..  /* A
13950 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20  llocate a range 
13960 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  of temporary reg
13970 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b  isters and the K
13980 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20  eyInfo needed.  
13990 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63  ** for the logic
139a0 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75   that removes du
139b0 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72  plicate result r
139c0 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a  ows when the.  *
139d0 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e  * operator is UN
139e0 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20  ION, EXCEPT, or 
139f0 49 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e  INTERSECT (but n
13a00 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20  ot UNION ALL).. 
13a10 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
13a20 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50  _ALL ){.    regP
13a30 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rev = 0;.  }else
13a40 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20  {.    int nExpr 
13a50 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
13a60 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
13a70 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20  nOrderBy>=nExpr 
13a80 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
13a90 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72  led );.    regPr
13aa0 65 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ev = sqlite3GetT
13ab0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
13ac0 20 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20 20 73   nExpr+1);.    s
13ad0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13ae0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
13af0 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20  0, regPrev);.   
13b00 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74   pKeyDup = sqlit
13b10 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
13b20 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
13b30 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65       sizeof(*pKe
13b40 79 44 75 70 29 20 2b 20 6e 45 78 70 72 2a 28 73  yDup) + nExpr*(s
13b50 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
13b60 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  1) );.    if( pK
13b70 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 70  eyDup ){.      p
13b80 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64  KeyDup->aSortOrd
13b90 65 72 20 3d 20 28 75 38 2a 29 26 70 4b 65 79 44  er = (u8*)&pKeyD
13ba0 75 70 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d  up->aColl[nExpr]
13bb0 3b 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d  ;.      pKeyDup-
13bc0 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e  >nField = (u16)n
13bd0 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4b 65 79  Expr;.      pKey
13be0 44 75 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64  Dup->enc = ENC(d
13bf0 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  b);.      for(i=
13c00 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29  0; i<nExpr; i++)
13c10 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75  {.        pKeyDu
13c20 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75  p->aColl[i] = mu
13c30 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
13c40 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
13c50 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d          pKeyDup-
13c60 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
13c70 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
13c80 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70  }.  }. .  /* Sep
13c90 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61  arate the left a
13ca0 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65  nd the right que
13cb0 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74  ry from one anot
13cc0 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50  her.  */.  p->pP
13cd0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69  rior = 0;.  sqli
13ce0 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
13cf0 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
13d00 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  , p->pOrderBy, "
13d10 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70  ORDER");.  if( p
13d20 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30  Prior->pPrior==0
13d30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
13d40 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
13d50 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  By(pParse, pPrio
13d60 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  r, pPrior->pOrde
13d70 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
13d80 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
13d90 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
13da0 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74  ters */.  comput
13db0 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
13dc0 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c  pParse, p, label
13dd0 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  End);.  if( p->i
13de0 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f  Limit && op==TK_
13df0 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69  ALL ){.    regLi
13e00 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitA = ++pParse-
13e10 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69  >nMem;.    regLi
13e20 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitB = ++pParse-
13e30 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
13e40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13e50 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66  OP_Copy, p->iOff
13e60 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74  set ? p->iOffset
13e70 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a  +1 : p->iLimit,.
13e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ea0 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20    regLimitA);.  
13eb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13ec0 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
13ed0 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69  regLimitA, regLi
13ee0 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  mitB);.  }else{.
13ef0 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20      regLimitA = 
13f00 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20  regLimitB = 0;. 
13f10 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
13f20 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
13f30 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d  imit);.  p->pLim
13f40 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  it = 0;.  sqlite
13f50 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
13f60 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70  p->pOffset);.  p
13f70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  ->pOffset = 0;..
13f80 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70    regAddrA = ++p
13f90 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
13fa0 65 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73  egEofA = ++pPars
13fb0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64  e->nMem;.  regAd
13fc0 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drB = ++pParse->
13fd0 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20  nMem;.  regEofB 
13fe0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
13ff0 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b  ;.  regOutA = ++
14000 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
14010 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72  regOutB = ++pPar
14020 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
14030 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
14040 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f  t(&destA, SRT_Co
14050 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
14060 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  A);.  sqlite3Sel
14070 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
14080 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tB, SRT_Coroutin
14090 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
140a0 20 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74 68   /* Jump past th
140b0 65 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f 75  e various subrou
140c0 74 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75 74  tines and corout
140d0 69 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69 6e  ines to the main
140e0 0a 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70  .  ** merge loop
140f0 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c  .  */.  j1 = sql
14100 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
14110 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64  , OP_Goto);.  ad
14120 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69  drSelectA = sqli
14130 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
14140 64 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65  dr(v);...  /* Ge
14150 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
14160 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
14170 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
14180 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ent to the.  ** 
14190 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70  left of the comp
141a0 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20  ound operator - 
141b0 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a  the "A" select..
141c0 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
141d0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
141e0 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  n coroutine for 
141f0 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  left SELECT"));.
14200 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74    pPrior->iLimit
14210 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20   = regLimitA;.  
14220 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
14230 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
14240 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
14250 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
14260 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
14270 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69   &destA);.  sqli
14280 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14290 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
142a0 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  regEofA);.  sqli
142b0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
142c0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
142d0 64 72 41 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70  drA);.  VdbeNoop
142e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64  Comment((v, "End
142f0 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
14300 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a  eft SELECT"));..
14310 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
14320 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
14330 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
14340 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20   statement on . 
14350 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20   ** the right - 
14360 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20  the "B" select. 
14370 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
14380 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
14390 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
143a0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
143b0 28 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f  ((v, "Begin coro
143c0 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20  utine for right 
143d0 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76  SELECT"));.  sav
143e0 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  edLimit = p->iLi
143f0 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73  mit;.  savedOffs
14400 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
14410 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  .  p->iLimit = r
14420 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69  egLimitB;.  p->i
14430 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20  Offset = 0;  .  
14440 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
14450 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d  r(iSub2, pParse-
14460 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
14470 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
14480 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
14490 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  tB);.  p->iLimit
144a0 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20   = savedLimit;. 
144b0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61   p->iOffset = sa
144c0 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c  vedOffset;.  sql
144d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
144e0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
144f0 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c   regEofB);.  sql
14500 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
14510 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
14520 64 64 72 42 29 3b 0a 20 20 56 64 62 65 4e 6f 6f  ddrB);.  VdbeNoo
14530 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  pComment((v, "En
14540 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  d coroutine for 
14550 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b  right SELECT"));
14560 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
14570 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
14580 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
14590 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
145a0 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   A.  ** select a
145b0 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
145c0 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
145d0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
145e0 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
145f0 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
14600 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29   routine for A")
14610 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20  );.  addrOutA = 
14620 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
14630 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
14640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14650 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65    p, &destA, pDe
14660 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20  st, regOutA,.   
14670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
14680 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
14690 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
146a0 46 46 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  FF, labelEnd);. 
146b0 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   .  /* Generate 
146c0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
146d0 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
146e0 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
146f0 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   B.  ** select a
14700 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
14710 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
14720 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
14730 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
14740 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
14750 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e  ION ){.    VdbeN
14760 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
14770 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
14780 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64  or B"));.    add
14790 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65  rOutB = generate
147a0 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
147b0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
147c0 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
147d0 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stB, pDest, regO
147e0 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utB,.           
147f0 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
14800 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e  KeyDup, P4_KEYIN
14810 46 4f 5f 53 54 41 54 49 43 2c 20 6c 61 62 65 6c  FO_STATIC, label
14820 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  End);.  }..  /* 
14830 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
14840 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
14850 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
14860 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a  om select A.  **
14870 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
14880 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
14890 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73  select B remains
148a0 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ..  */.  VdbeNoo
148b0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
148c0 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-A subroutine")
148d0 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
148e0 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
148f0 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
14900 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c    addrEofA = sql
14910 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14920 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61  , OP_Goto, 0, la
14930 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65  belEnd);.  }else
14940 7b 20 20 0a 20 20 20 20 61 64 64 72 45 6f 66 41  {  .    addrEofA
14950 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14960 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
14970 65 67 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e 64  egEofB, labelEnd
14980 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14990 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
149a0 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61  osub, regOutB, a
149b0 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 73 71  ddrOutB);.    sq
149c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
149d0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
149e0 41 64 64 72 42 29 3b 0a 20 20 20 20 73 71 6c 69  AddrB);.    sqli
149f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14a00 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
14a10 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e  rEofA);.    p->n
14a20 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72  SelectRow += pPr
14a30 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
14a40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
14a50 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
14a60 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
14a70 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
14a80 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20  lect B.  ** are 
14a90 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
14aa0 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
14ab0 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t A remains..  *
14ac0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  /.  if( op==TK_I
14ad0 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
14ae0 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45  addrEofB = addrE
14af0 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ofA;.    if( p->
14b00 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72  nSelectRow > pPr
14b10 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ior->nSelectRow 
14b20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
14b30 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
14b40 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  tRow;.  }else{  
14b50 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
14b60 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20  ment((v, "eof-B 
14b70 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
14b80 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71     addrEofB = sq
14b90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14ba0 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
14bb0 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  A, labelEnd);.  
14bc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14bd0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
14be0 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
14bf0 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
14c00 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
14c10 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
14c20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14c30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
14c40 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42  oto, 0, addrEofB
14c50 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
14c60 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
14c70 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
14c80 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A<B.  */.  Vdbe
14c90 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
14ca0 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-lt-B subrouti
14cb0 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74  ne"));.  addrAlt
14cc0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
14cd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
14ce0 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
14cf0 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  OutA);.  sqlite3
14d00 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
14d10 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
14d20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14d30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
14d40 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f   regEofA, addrEo
14d50 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fA);.  sqlite3Vd
14d60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
14d70 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
14d80 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  r);..  /* Genera
14d90 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
14da0 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d  e the case of A=
14db0 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  =B.  */.  if( op
14dc0 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
14dd0 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
14de0 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ltB;.  }else if(
14df0 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
14e00 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  T ){.    addrAeq
14e10 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
14e20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20    addrAltB++;.  
14e30 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e  }else{.    VdbeN
14e40 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
14e50 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-eq-B subroutin
14e60 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65  e"));.    addrAe
14e70 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33  qB =.    sqlite3
14e80 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
14e90 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
14ea0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14eb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
14ec0 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72  f, regEofA, addr
14ed0 45 6f 66 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  EofA);.    sqlit
14ee0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14ef0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
14f00 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lCmpr);.  }..  /
14f10 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14f20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
14f30 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20  se of A>B.  */. 
14f40 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
14f50 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62  ((v, "A-gt-B sub
14f60 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
14f70 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33  drAgtB = sqlite3
14f80 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
14f90 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  v);.  if( op==TK
14fa0 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
14fb0 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  NION ){.    sqli
14fc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14fd0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
14fe0 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
14ff0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
15000 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
15010 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20  ld, regAddrB);. 
15020 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15030 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
15040 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b  EofB, addrEofB);
15050 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15060 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
15070 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
15080 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20  .  /* This code 
15090 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69  runs once to ini
150a0 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69  tialize everythi
150b0 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ng..  */.  sqlit
150c0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
150d0 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , j1);.  sqlite3
150e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
150f0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
15100 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofA);.  sqlite3
15110 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15120 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
15130 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofB);.  sqlite3
15140 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15150 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 41  _Gosub, regAddrA
15160 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a  , addrSelectA);.
15170 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15180 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
15190 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 53   regAddrB, addrS
151a0 65 6c 65 63 74 42 29 3b 0a 20 20 73 71 6c 69 74  electB);.  sqlit
151b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
151c0 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20  OP_If, regEofA, 
151d0 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c  addrEofA);.  sql
151e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
151f0 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42  , OP_If, regEofB
15200 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20 20  , addrEofB);..  
15210 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65  /* Implement the
15220 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70   main merge loop
15230 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
15240 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15250 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  v, labelCmpr);. 
15260 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15270 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61  p4(v, OP_Permuta
15280 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28  tion, 0, 0, 0, (
15290 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20  char*)aPermute, 
152a0 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20  P4_INTARRAY);.  
152b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
152c0 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
152d0 20 64 65 73 74 41 2e 69 4d 65 6d 2c 20 64 65 73   destA.iMem, des
152e0 74 42 2e 69 4d 65 6d 2c 20 6e 4f 72 64 65 72 42  tB.iMem, nOrderB
152f0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
15300 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
15310 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34  r*)pKeyMerge, P4
15320 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
15330 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15340 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
15350 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64  p, addrAltB, add
15360 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29  rAeqB, addrAgtB)
15370 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  ;..  /* Release 
15380 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
15390 65 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ers.  */.  if( r
153a0 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 73 71  egPrev ){.    sq
153b0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
153c0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
153d0 67 50 72 65 76 2c 20 6e 4f 72 64 65 72 42 79 2b  gPrev, nOrderBy+
153e0 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  1);.  }..  /* Ju
153f0 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20 70  mp to the this p
15400 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  oint in order to
15410 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71   terminate the q
15420 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  uery..  */.  sql
15430 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
15440 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64  abel(v, labelEnd
15450 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
15460 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
15470 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20  t columns.  */. 
15480 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
15490 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
154a0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69  .    Select *pFi
154b0 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  rst = pPrior;.  
154c0 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
154d0 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
154e0 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
154f0 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  r;.    generateC
15500 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
15510 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45  e, 0, pFirst->pE
15520 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
15530 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20   Reassembly the 
15540 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73  compound query s
15550 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
15560 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c  e freed correctl
15570 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61  y.  ** by the ca
15580 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
15590 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
155a0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
155b0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
155c0 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d   p->pPrior);.  }
155d0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70  .  p->pPrior = p
155e0 50 72 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54  Prior;..  /*** T
155f0 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72  BD:  Insert subr
15600 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20  outine calls to 
15610 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e  close cursors on
15620 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a   incomplete.  **
15630 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a  ** subqueries **
15640 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d  **/.  explainCom
15650 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70  posite(pParse, p
15660 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75  ->op, iSub1, iSu
15670 62 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  b2, 0);.  return
15680 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
15690 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
156a0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
156b0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
156c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
156d0 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72  _VIEW)./* Forwar
156e0 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a  d Declarations *
156f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
15700 62 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69  bstExprList(sqli
15710 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c  te3*, ExprList*,
15720 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29   int, ExprList*)
15730 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  ;.static void su
15740 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65  bstSelect(sqlite
15750 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e  3*, Select *, in
15760 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a  t, ExprList *);.
15770 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f  ./*.** Scan thro
15780 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69  ugh the expressi
15790 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61  on pExpr.  Repla
157a0 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ce every referen
157b0 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d  ce to.** a colum
157c0 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
157d0 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20  r iTable with a 
157e0 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c  copy of the iCol
157f0 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20  umn-th.** entry 
15800 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74  in pEList.  (But
15810 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65   leave reference
15820 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63  s to the ROWID c
15830 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  olumn .** unchan
15840 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ged.).**.** This
15850 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74   routine is part
15860 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69   of the flatteni
15870 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41  ng procedure.  A
15880 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f   subquery.** who
15890 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  se result set is
158a0 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69   defined by pELi
158b0 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e  st appears as en
158c0 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52  try in the.** FR
158d0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
158e0 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20  ELECT such that 
158f0 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
15900 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74  assigned to that
15910 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20  .** FORM clause 
15920 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e  entry is iTable.
15930 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
15940 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72  ake the necessar
15950 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
15960 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69   pExpr so that i
15970 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c  t refers directl
15980 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20  y to the source 
15990 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20  table.** of the 
159a0 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20  subquery rather 
159b0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
159c0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
159d0 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
159e0 73 75 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c  substExpr(.  sql
159f0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
15a00 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
15a10 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73  c errors to this
15a20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
15a30 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
15a40 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20       /* Expr in 
15a50 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69  which substituti
15a60 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69  on occurs */.  i
15a70 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
15a80 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
15a90 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f  e substituted */
15aa0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
15ab0 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69  ist    /* Substi
15ac0 74 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  tute expressions
15ad0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78   */.){.  if( pEx
15ae0 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pr==0 ) return 0
15af0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
15b00 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
15b10 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
15b20 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  Table ){.    if(
15b30 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
15b40 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
15b50 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
15b60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15b70 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20   Expr *pNew;.   
15b80 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
15b90 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69  t!=0 && pExpr->i
15ba0 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e  Column<pEList->n
15bb0 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73  Expr );.      as
15bc0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
15bd0 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
15be0 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
15bf0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
15c00 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c  3ExprDup(db, pEL
15c10 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43  ist->a[pExpr->iC
15c20 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29  olumn].pExpr, 0)
15c30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
15c40 20 26 26 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c   && pExpr->pColl
15c50 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
15c60 2d 3e 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d  ->pColl = pExpr-
15c70 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  >pColl;.      }.
15c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15c90 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
15ca0 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20  r);.      pExpr 
15cb0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20  = pNew;.    }.  
15cc0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72  }else{.    pExpr
15cd0 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45  ->pLeft = substE
15ce0 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  xpr(db, pExpr->p
15cf0 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  Left, iTable, pE
15d00 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72  List);.    pExpr
15d10 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73 74  ->pRight = subst
15d20 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
15d30 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20  pRight, iTable, 
15d40 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  pEList);.    if(
15d50 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
15d60 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
15d70 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73  lect) ){.      s
15d80 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
15d90 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
15da0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
15db0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15dc0 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
15dd0 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  (db, pExpr->x.pL
15de0 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
15df0 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
15e00 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a    return pExpr;.
15e10 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
15e20 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73  bstExprList(.  s
15e30 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
15e40 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
15e50 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65  lloc errors here
15e60 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
15e70 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69  pList,     /* Li
15e80 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69  st to scan and i
15e90 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
15ea0 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20  substitutes */. 
15eb0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
15ec0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
15ed0 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
15ee0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
15ef0 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75  pEList     /* Su
15f00 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20  bstitute values 
15f10 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
15f20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
15f30 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
15f40 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
15f50 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69  r; i++){.    pLi
15f60 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  st->a[i].pExpr =
15f70 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
15f80 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
15f90 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
15fa0 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
15fb0 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
15fc0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
15fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f           /* Repo
15fe0 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
15ff0 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63   here */.  Selec
16000 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
16010 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
16020 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ent in which to 
16030 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f  make substitutio
16040 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ns */.  int iTab
16050 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
16060 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c  Table to be repl
16070 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  aced */.  ExprLi
16080 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f  st *pEList     /
16090 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c  * Substitute val
160a0 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  ues */.){.  SrcL
160b0 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72  ist *pSrc;.  str
160c0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
160d0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
160e0 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
160f0 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72  urn;.  substExpr
16100 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69  List(db, p->pELi
16110 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
16120 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
16130 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f  List(db, p->pGro
16140 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  upBy, iTable, pE
16150 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
16160 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f  prList(db, p->pO
16170 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20  rderBy, iTable, 
16180 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48  pEList);.  p->pH
16190 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70  aving = substExp
161a0 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  r(db, p->pHaving
161b0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
161c0 29 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  );.  p->pWhere =
161d0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
161e0 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65  ->pWhere, iTable
161f0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
16200 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e  stSelect(db, p->
16210 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20  pPrior, iTable, 
16220 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63 20  pEList);.  pSrc 
16230 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
16240 65 72 74 28 20 70 53 72 63 20 29 3b 20 20 2f 2a  ert( pSrc );  /*
16250 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c 45 43   Even for (SELEC
16260 54 20 31 29 20 77 65 20 68 61 76 65 3a 20 70 53  T 1) we have: pS
16270 72 63 21 3d 30 20 62 75 74 20 70 53 72 63 2d 3e  rc!=0 but pSrc->
16280 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28  nSrc==0 */.  if(
16290 20 41 4c 57 41 59 53 28 70 53 72 63 29 20 29 7b   ALWAYS(pSrc) ){
162a0 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d  .    for(i=pSrc-
162b0 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72  >nSrc, pItem=pSr
162c0 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  c->a; i>0; i--, 
162d0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
162e0 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
162f0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
16300 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
16310 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
16320 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
16330 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16340 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
16350 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
16360 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  EW) */..#if !def
16370 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
16380 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
16390 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
163a0 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54  IT_VIEW)./*.** T
163b0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
163c0 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
163d0 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20  subqueries as a 
163e0 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69  performance opti
163f0 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  mization..** Thi
16400 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
16410 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
16420 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
16430 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f   no flattening o
16440 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
16450 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
16460 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
16470 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
16480 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
16490 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
164a0 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
164b0 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
164c0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
164d0 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
164e0 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
164f0 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
16500 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
16510 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
16520 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
16530 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
16540 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
16550 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
16560 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
16570 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
16580 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
16590 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
165a0 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
165b0 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
165c0 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
165d0 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
165e0 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
165f0 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
16600 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
16610 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
16620 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
16630 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
16640 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
16650 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
16660 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
16670 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
16680 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
16690 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
166a0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
166b0 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
166c0 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
166d0 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
166e0 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
166f0 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
16700 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20  ification gives 
16710 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a  the same result.
16720 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20  ** but only has 
16730 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61  to scan the data
16740 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61   once.  And beca
16750 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68  use indices migh
16760 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74  t .** exist on t
16770 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63  he table t1, a c
16780 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20  omplete scan of 
16790 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62  the data might b
167a0 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a  e.** avoided..**
167b0 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69  .** Flattening i
167c0 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64  s only attempted
167d0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
167e0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
167f0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  e:.**.**   (1)  
16800 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
16810 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
16820 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
16830 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
16840 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75  **   (2)  The su
16850 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e  bquery is not an
16860 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68   aggregate or th
16870 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
16880 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
16890 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75  **   (3)  The su
168a0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
168b0 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
168c0 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20  of a left outer 
168d0 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28  join.**        (
168e0 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65  Originally ticke
168f0 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67 74  t #306.  Strengt
16900 68 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20  hened by ticket 
16910 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28  #3300).**.**   (
16920 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
16930 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
16940 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41  ..**.**  (**)  A
16950 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74  t one point rest
16960 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64  rictions (4) and
16970 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20 73   (5) defined a s
16980 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43  ubset of DISTINC
16990 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d  T.**        sub-
169a0 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65 72  queries that wer
169b0 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20  e excluded from 
169c0 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
169d0 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a  n. Restriction .
169e0 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68 61  **        (4) ha
169f0 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70  s since been exp
16a00 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65  anded to exclude
16a10 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75   all DISTINCT su
16a20 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20  bqueries..**.** 
16a30 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75    (6)  The subqu
16a40 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
16a50 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
16a60 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
16a70 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
16a80 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
16a90 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
16aa0 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63  ery has a FROM c
16ab0 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46  lause.  TODO:  F
16ac0 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77 69  or subqueries wi
16ad0 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  thout.**        
16ae0 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63  A FROM clause, c
16af0 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 61  onsider adding a
16b00 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68   FROM close with
16b10 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20   the special.** 
16b20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c         table sql
16b30 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f  ite_once that co
16b40 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67  nsists of a sing
16b50 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e  le row containin
16b60 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69  g a.**        si
16b70 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  ngle NULL..**.**
16b80 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71     (8)  The subq
16b90 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
16ba0 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
16bb0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
16bc0 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
16bd0 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75    (9)  The subqu
16be0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
16bf0 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
16c00 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
16c10 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
16c20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
16c30 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73 75  **  (10)  The su
16c40 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
16c50 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
16c60 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
16c70 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20  y does not.**   
16c80 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a       use LIMIT..
16c90 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65  **.**  (11)  The
16ca0 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
16cb0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
16cc0 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f   not both have O
16cd0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e  RDER BY clauses.
16ce0 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f  .**.**  (**)  No
16cf0 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20  t implemented.  
16d00 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65  Subsumed into re
16d10 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20  striction (3).  
16d20 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  Was previously.*
16d30 2a 20 20 20 20 20 20 20 20 61 20 73 65 70 61 72  *        a separ
16d40 61 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20  ate restriction 
16d50 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69  deriving from ti
16d60 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a  cket #350..**.**
16d70 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71    (13)  The subq
16d80 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71  uery and outer q
16d90 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
16da0 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
16db0 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62  *  (14)  The sub
16dc0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
16dd0 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a  se OFFSET..**.**
16de0 20 20 28 31 35 29 20 20 54 68 65 20 6f 75 74 65    (15)  The oute
16df0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70  r query is not p
16e00 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  art of a compoun
16e10 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a  d select or the.
16e20 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65  **        subque
16e30 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ry does not have
16e40 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e   a LIMIT clause.
16e50 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20  .**        (See 
16e60 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64  ticket #2339 and
16e70 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31   ticket [02a8e81
16e80 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  d44])..**.**  (1
16e90 36 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  6)  The outer qu
16ea0 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
16eb0 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 73  gregate or the s
16ec0 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20  ubquery does.** 
16ed0 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61         not conta
16ee0 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54  in ORDER BY.  (T
16ef0 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68  icket #2942)  Th
16f00 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d  is used to not m
16f10 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  atter.**        
16f20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75  until we introdu
16f30 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f  ced the group_co
16f40 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ncat() function.
16f50 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20    .**.**  (17)  
16f60 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  The sub-query is
16f70 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20   not a compound 
16f80 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73  select, or it is
16f90 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a   a UNION ALL .**
16fa0 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64          compound
16fb0 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20   clause made up 
16fc0 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d  entirely of non-
16fd0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
16fe0 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20  s, and .**      
16ff0 20 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65    the parent que
17000 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ry:.**.**       
17010 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65     * is not itse
17020 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  lf part of a com
17030 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a  pound select,.**
17040 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
17050 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
17060 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65 72  or DISTINCT quer
17070 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  y, and.**       
17080 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f     * is not a jo
17090 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  in.**.**        
170a0 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73  The parent and s
170b0 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e  ub-query may con
170c0 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73  tain WHERE claus
170d0 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a  es. Subject to.*
170e0 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20 28  *        rules (
170f0 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31  11), (13) and (1
17100 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73  4), they may als
17110 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  o contain ORDER 
17120 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49  BY,.**        LI
17130 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
17140 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73 75 62  lauses.  The sub
17150 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65  query cannot use
17160 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
17170 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72          operator
17180 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f   other than UNIO
17190 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c  N ALL because al
171a0 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70  l the other comp
171b0 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
171c0 70 65 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e  perators have an
171d0 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43   implied DISTINC
171e0 54 20 77 68 69 63 68 20 69 73 20 64 69 73 61 6c  T which is disal
171f0 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20  lowed by.**     
17200 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28     restriction (
17210 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20  4)..**.**  (18) 
17220 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
17230 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
17240 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c  select, then all
17250 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
17260 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 62 79          ORDER by
17270 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 70   clause of the p
17280 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73 69  arent must be si
17290 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20  mple references 
172a0 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  to .**        co
172b0 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75 62  lumns of the sub
172c0 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28  -query..**.**  (
172d0 31 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  19)  The subquer
172e0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
172f0 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
17300 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
17310 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20  .**        have 
17320 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  a WHERE clause..
17330 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20  **.**  (20)  If 
17340 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
17350 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
17360 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  ct, then it must
17370 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
17380 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63     an ORDER BY c
17390 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23  lause.  Ticket #
173a0 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20  3773.  We could 
173b0 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74  relax this const
173c0 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  raint.**        
173d0 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79 69  somewhat by sayi
173e0 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72 6d  ng that the term
173f0 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
17400 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a  Y clause must.**
17410 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20 61          appear a
17420 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73  s unmodified res
17430 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ult columns in t
17440 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
17450 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20   But we.**      
17460 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74    have other opt
17470 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69  imizations in mi
17480 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  nd to deal with 
17490 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  that case..**.**
174a0 20 20 28 32 31 29 20 20 54 68 65 20 73 75 62 71    (21)  The subq
174b0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
174c0 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
174d0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
174e0 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54  t.**        DIST
174f0 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b  INCT.  (See tick
17500 65 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29  et [752e1646fc])
17510 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ..**.** In this 
17520 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22  routine, the "p"
17530 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
17540 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
17550 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54  uter query..** T
17560 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
17570 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ->pSrc->a[iFrom]
17580 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65  .  isAgg is true
17590 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
175a0 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72  ery.** uses aggr
175b0 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75  egates and subqu
175c0 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65  eryIsAgg is true
175d0 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
175e0 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
175f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74  ..**.** If flatt
17600 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74  ening is not att
17610 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75  empted, this rou
17620 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
17630 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  and returns 0..*
17640 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
17650 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
17660 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
17670 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
17680 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
17690 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
176a0 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
176b0 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
176c0 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
176d0 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
176e0 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
176f0 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
17700 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73  Subquery(.  Pars
17710 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
17720 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
17730 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
17740 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
17750 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
17760 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
17770 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
17780 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
17790 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
177a0 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
177b0 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
177c0 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20  /.  int isAgg,  
177d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
177e0 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
177f0 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
17800 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
17810 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nt subqueryIsAgg
17820 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
17830 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
17840 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
17850 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ions */.){.  con
17860 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41  st char *zSavedA
17870 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61  uthContext = pPa
17880 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
17890 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61  t;.  Select *pPa
178a0 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  rent;.  Select *
178b0 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54  pSub;       /* T
178c0 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f  he inner query o
178d0 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a  r "subquery" */.
178e0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b    Select *pSub1;
178f0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
17900 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73   to the rightmos
17910 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d  t select in sub-
17920 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
17930 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f  st *pSrc;      /
17940 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
17950 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
17960 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
17970 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a  t *pSubSrc;   /*
17980 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
17990 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
179a0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
179b0 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65  pList;    /* The
179c0 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
179d0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
179e0 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
179f0 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
17a00 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
17a10 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74   the pSub result
17a20 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20   set temp table 
17a30 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
17a40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
17a50 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
17a60 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
17a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17a80 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
17a90 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
17aa0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75  rcList_item *pSu
17ab0 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20  bitem;   /* The 
17ac0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  subquery */.  sq
17ad0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
17ae0 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68  se->db;..  /* Ch
17af0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c  eck to see if fl
17b00 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
17b10 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30  itted.  Return 0
17b20 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20   if not..  */.  
17b30 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
17b40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72    assert( p->pPr
17b50 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e  ior==0 );  /* Un
17b60 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20  able to flatten 
17b70 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73  compound queries
17b80 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c   */.  if( db->fl
17b90 61 67 73 20 26 20 53 51 4c 49 54 45 5f 51 75 65  ags & SQLITE_Que
17ba0 72 79 46 6c 61 74 74 65 6e 65 72 20 29 20 72 65  ryFlattener ) re
17bb0 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
17bc0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
17bd0 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
17be0 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
17bf0 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
17c00 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
17c10 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72  a[iFrom];.  iPar
17c20 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ent = pSubitem->
17c30 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20  iCursor;.  pSub 
17c40 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
17c50 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ect;.  assert( p
17c60 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Sub!=0 );.  if( 
17c70 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72  isAgg && subquer
17c80 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20  yIsAgg ) return 
17c90 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
17ca0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
17cb0 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (1)  */.  if( 
17cc0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26  subqueryIsAgg &&
17cd0 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20   pSrc->nSrc>1 ) 
17ce0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
17cf0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
17d00 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62  n (2)  */.  pSub
17d10 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
17d20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
17d30 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f  Src );.  /* Prio
17d40 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31  r to version 3.1
17d50 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  .2, when LIMIT a
17d60 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f  nd OFFSET had to
17d70 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74   be simple const
17d80 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61  ants,.  ** not a
17d90 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
17da0 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65  sions, we allowe
17db0 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67  d some combining
17dc0 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46   of LIMIT and OF
17dd0 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73  FSET.  ** becaus
17de0 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20  e they could be 
17df0 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70  computed at comp
17e00 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77  ile-time.  But w
17e10 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
17e20 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65  FSET.  ** became
17e30 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
17e40 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20  ssions, we were 
17e50 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65  forced to add re
17e60 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a  strictions (13).
17e70 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a    ** and (14). *
17e80 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
17e90 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69  imit && p->pLimi
17ea0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
17eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
17ec0 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a  striction (13) *
17ed0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f  /.  if( pSub->pO
17ee0 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30  ffset ) return 0
17ef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
17f10 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a  striction (14) *
17f20 2f 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68  /.  if( p->pRigh
17f30 74 6d 6f 73 74 20 26 26 20 70 53 75 62 2d 3e 70  tmost && pSub->p
17f40 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74  Limit ){.    ret
17f50 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f80 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
17f90 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (15) */.  }.  i
17fa0 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
17fb0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fd0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
17fe0 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69  tion (7)  */.  i
17ff0 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
18000 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
18010 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
18020 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
18030 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69  tion (5)  */.  i
18040 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
18050 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  && (pSrc->nSrc>1
18060 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20   || isAgg) ){.  
18070 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
18080 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
18090 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20  ions (8)(9) */. 
180a0 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c   }.  if( (p->sel
180b0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
180c0 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75  nct)!=0 && subqu
180d0 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
180e0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
180f0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
18100 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20  n (6)  */.  }.  
18110 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
18120 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
18130 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  y ){.     return
18140 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
18150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18170 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31   Restriction (11
18180 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69  ) */.  }.  if( i
18190 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f  sAgg && pSub->pO
181a0 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
181b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
181c0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
181d0 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70   (16) */.  if( p
181e0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
181f0 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
18200 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
18210 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
18220 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70   (19) */.  if( p
18230 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28  Sub->pLimit && (
18240 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
18250 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b  _Distinct)!=0 ){
18260 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
18270 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
18280 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20  iction (21) */. 
18290 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54   }..  /* OBSOLET
182a0 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a  E COMMENT 1:.  *
182b0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a  * Restriction 3:
182c0 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
182d0 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b  y is a join, mak
182e0 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75  e sure the subqu
182f0 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74  ery is .  ** not
18300 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67   used as the rig
18310 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e  ht operand of an
18320 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78   outer join.  Ex
18330 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
18340 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  is.  ** is not a
18350 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
18360 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
18370 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
18380 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
18390 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
183a0 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
183b0 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
183c0 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
183d0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
183e0 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
183f0 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
18400 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
18410 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20  me thing..  **. 
18420 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d   ** OBSOLETE COM
18430 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73  MENT 2:.  ** Res
18440 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66  triction 12:  If
18450 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
18460 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
18470 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
18480 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61  er.  ** join, ma
18490 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
184a0 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
184b0 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41  E clause..  ** A
184c0 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68  n examples of wh
184d0 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c  y this is not al
184e0 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
184f0 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
18500 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c   OUTER JOIN (SEL
18510 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48  ECT * FROM t2 WH
18520 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a  ERE t2.x>0).  **
18530 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
18540 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
18550 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
18560 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
18570 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
18580 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e 78  N t2) WHERE t2.x
18590 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74  >0.  **.  ** But
185a0 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74   the t2.x>0 test
185b0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69   will always fai
185c0 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20  l on a NULL row 
185d0 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a  of t2, which.  *
185e0 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f  * effectively co
185f0 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45 52  nverts the OUTER
18600 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e   JOIN into an IN
18610 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20  NER JOIN..  **. 
18620 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44   ** THIS OVERRID
18630 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d  ES OBSOLETE COMM
18640 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f  ENTS 1 AND 2 ABO
18650 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20  VE:.  ** Ticket 
18660 23 33 33 30 30 20 73 68 6f 77 73 20 74 68 61 74  #3300 shows that
18670 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
18680 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20  right term of a 
18690 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69  LEFT JOIN.  ** i
186a0 73 20 66 72 61 75 67 68 74 20 77 69 74 68 20 64  s fraught with d
186b0 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20  anger.  Best to 
186c0 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20  avoid the whole 
186d0 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20  thing.  If the. 
186e0 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73 20   ** subquery is 
186f0 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
18700 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74  f a LEFT JOIN, t
18710 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74  hen do not flatt
18720 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  en..  */.  if( (
18730 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
18740 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
18750 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
18760 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  0;.  }..  /* Res
18770 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20  triction 17: If 
18780 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
18790 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
187a0 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  CT, then it must
187b0 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74  .  ** use only t
187c0 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
187d0 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20  rator. And none 
187e0 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65  of the simple se
187f0 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a  lect queries.  *
18800 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  * that make up t
18810 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
18820 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  CT are allowed t
18830 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20 6f  o be aggregate o
18840 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20  r distinct.  ** 
18850 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
18860 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  if( pSub->pPrior
18870 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62   ){.    if( pSub
18880 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
18890 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
188a0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30  * Restriction 20
188b0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
188c0 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73  ( isAgg || (p->s
188d0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
188e0 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72  tinct)!=0 || pSr
188f0 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20  c->nSrc!=1 ){.  
18900 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18910 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62    }.    for(pSub
18920 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70  1=pSub; pSub1; p
18930 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69  Sub1=pSub1->pPri
18940 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  or){.      testc
18950 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
18960 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
18970 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
18980 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
18990 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
189a0 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  se( (pSub1->selF
189b0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
189c0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
189d0 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65  ))==SF_Aggregate
189e0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
189f0 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20  ( pSub->pSrc!=0 
18a00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  );.      if( (pS
18a10 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
18a20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
18a30 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20  Aggregate))!=0. 
18a40 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d        || (pSub1-
18a50 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31  >pPrior && pSub1
18a60 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20  ->op!=TK_ALL) . 
18a70 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e        || pSub1->
18a80 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20  pSrc->nSrc<1.   
18a90 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65     ){.        re
18aa0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
18ab0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18ac0 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
18ad0 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  c>1 );.    }..  
18ae0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
18af0 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   18. */.    if( 
18b00 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
18b10 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
18b20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
18b30 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
18b40 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  pr; ii++){.     
18b50 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
18b60 42 79 2d 3e 61 5b 69 69 5d 2e 69 4f 72 64 65 72  By->a[ii].iOrder
18b70 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72  ByCol==0 ) retur
18b80 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
18b90 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a   }.  }..  /*****
18ba0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
18bb0 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e  s point, flatten
18bc0 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
18bd0 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41  . *****/..  /* A
18be0 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62  uthorize the sub
18bf0 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73  query */.  pPars
18c00 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
18c10 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  = pSubitem->zNam
18c20 65 3b 0a 20 20 73 71 6c 69 74 65 33 41 75 74 68  e;.  sqlite3Auth
18c30 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
18c40 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
18c50 30 2c 20 30 29 3b 0a 20 20 70 50 61 72 73 65 2d  0, 0);.  pParse-
18c60 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
18c70 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
18c80 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  t;..  /* If the 
18c90 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
18ca0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
18cb0 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28  tatement, then (
18cc0 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a  by restrictions.
18cd0 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61    ** 17 and 18 a
18ce0 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65  bove) it must be
18cf0 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64   a UNION ALL and
18d00 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
18d10 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20  y must .  ** be 
18d20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a  of the form:.  *
18d30 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
18d40 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52  T <expr-list> FR
18d50 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29  OM (<sub-query>)
18d60 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20   <where-clause> 
18d70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  .  **.  ** follo
18d80 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52  wed by any ORDER
18d90 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f   BY, LIMIT and/o
18da0 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  r OFFSET clauses
18db0 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a  . This block.  *
18dc0 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f  * creates N-1 co
18dd0 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65  pies of the pare
18de0 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74  nt query without
18df0 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c   any ORDER BY, L
18e00 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46  IMIT or .  ** OF
18e10 46 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64  FSET clauses and
18e20 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74   joins them to t
18e30 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64  he left-hand-sid
18e40 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
18e50 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49  l.  ** using UNI
18e60 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73  ON ALL operators
18e70 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e  . In this case N
18e80 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
18e90 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65  f simple.  ** se
18ea0 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20  lect statements 
18eb0 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  in the compound 
18ec0 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a  sub-query..  **.
18ed0 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
18ee0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
18ef0 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20  CT a+1 FROM (.  
18f00 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
18f10 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   x FROM tab.  **
18f20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
18f30 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
18f40 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a  LECT y FROM tab.
18f50 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
18f60 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
18f70 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32    SELECT abs(z*2
18f80 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a  ) FROM tab2.  **
18f90 20 20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d       ) WHERE a!=
18fa0 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a  5 ORDER BY 1.  *
18fb0 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d  *.  ** Transform
18fc0 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20  ed into:.  **.  
18fd0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
18fe0 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45  1 FROM tab WHERE
18ff0 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20   x+1!=5.  **    
19000 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
19010 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46      SELECT y+1 F
19020 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b  ROM tab WHERE y+
19030 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e  1!=5.  **     UN
19040 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
19050 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29   SELECT abs(z*2)
19060 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45  +1 FROM tab2 WHE
19070 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35  RE abs(z*2)+1!=5
19080 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20  .  **     ORDER 
19090 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  BY 1.  **.  ** W
190a0 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20  e call this the 
190b0 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65  "compound-subque
190c0 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a  ry flattening"..
190d0 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d    */.  for(pSub=
190e0 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53  pSub->pPrior; pS
190f0 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70  ub; pSub=pSub->p
19100 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65  Prior){.    Sele
19110 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78  ct *pNew;.    Ex
19120 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
19130 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
19140 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
19150 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
19160 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
19170 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
19180 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
19190 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  0;.    p->pSrc =
191a0 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f   0;.    p->pPrio
191b0 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c  r = 0;.    p->pL
191c0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  imit = 0;.    pN
191d0 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ew = sqlite3Sele
191e0 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b  ctDup(db, p, 0);
191f0 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
19200 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e   pLimit;.    p->
19210 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
19220 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  rBy;.    p->pSrc
19230 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e   = pSrc;.    p->
19240 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20  op = TK_ALL;.   
19250 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d   p->pRightmost =
19260 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77   0;.    if( pNew
19270 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ==0 ){.      pNe
19280 77 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  w = pPrior;.    
19290 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65  }else{.      pNe
192a0 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  w->pPrior = pPri
192b0 6f 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  or;.      pNew->
192c0 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a  pRightmost = 0;.
192d0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 50 72      }.    p->pPr
192e0 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ior = pNew;.    
192f0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
19300 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b  iled ) return 1;
19310 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
19320 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
19330 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f  iFrom-th entry o
19340 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
19350 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  e .  ** in the o
19360 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f  uter query..  */
19370 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20  .  pSub = pSub1 
19380 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
19390 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  ect;..  /* Delet
193a0 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  e the transient 
193b0 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
193c0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
193d0 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
193e0 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
193f0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
19400 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
19410 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
19420 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
19430 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
19440 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
19450 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
19460 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
19470 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ase = 0;.  pSubi
19480 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  tem->zName = 0;.
19490 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69    pSubitem->zAli
194a0 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  as = 0;.  pSubit
194b0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b  em->pSelect = 0;
194c0 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c  ..  /* Defer del
194d0 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20  eting the Table 
194e0 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
194f0 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
19500 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63  subquery until c
19510 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69  ode generation i
19520 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c  s.  ** complete,
19530 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79   since there may
19540 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70   still exist Exp
19550 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20 74  r.pTab entries t
19560 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74  hat.  ** refer t
19570 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  o the subquery e
19580 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65  ven after flatte
19590 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33  ning.  Ticket #3
195a0 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70  346..  **.  ** p
195b0 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73  Subitem->pTab is
195c0 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c   always non-NULL
195d0 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69 63   by test restric
195e0 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20  tions and tests 
195f0 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  above..  */.  if
19600 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74 65  ( ALWAYS(pSubite
19610 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  m->pTab!=0) ){. 
19620 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f     Table *pTabTo
19630 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Del = pSubitem->
19640 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
19650 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31  abToDel->nRef==1
19660 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20   ){.      Parse 
19670 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
19680 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
19690 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
196a0 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78   pTabToDel->pNex
196b0 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65  tZombie = pTople
196c0 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b  vel->pZombieTab;
196d0 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  .      pToplevel
196e0 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70  ->pZombieTab = p
196f0 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65  TabToDel;.    }e
19700 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54  lse{.      pTabT
19710 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  oDel->nRef--;.  
19720 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d    }.    pSubitem
19730 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a  ->pTab = 0;.  }.
19740 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
19750 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e  ing loop runs on
19760 63 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d  ce for each term
19770 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73   in a compound-s
19780 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61  ubquery.  ** fla
19790 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63  ttening (as desc
197a0 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49  ribed above).  I
197b0 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
197c0 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a   different kind.
197d0 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69    ** of flatteni
197e0 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e  ng - a flattenin
197f0 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  g other than a c
19800 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
19810 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20   flattening -.  
19820 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f  ** then this loo
19830 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65  p only runs once
19840 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
19850 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20   loop moves all 
19860 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d  of the FROM elem
19870 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71  ents of the subq
19880 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20  uery into the.  
19890 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
198a0 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
198b0 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64  query.  Before d
198c0 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d  oing this, remem
198d0 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ber.  ** the cur
198e0 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
198f0 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65  he original oute
19900 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65  r query FROM ele
19910 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61  ment in.  ** iPa
19920 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65  rent.  The iPare
19930 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e  nt cursor will n
19940 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53  ever be used.  S
19950 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20  ubsequent code. 
19960 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78   ** will scan ex
19970 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e  pressions lookin
19980 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65  g for iParent re
19990 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70  ferences and rep
199a0 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20  lace.  ** those 
199b0 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20  references with 
199c0 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
199d0 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20   resolve to the 
199e0 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20  subquery FROM.  
199f0 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61  ** elements we a
19a00 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69  re now copying i
19a10 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50  n..  */.  for(pP
19a20 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74  arent=p; pParent
19a30 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e  ; pParent=pParen
19a40 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d  t->pPrior, pSub=
19a50 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
19a60 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a     int nSubSrc;.
19a70 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20      u8 jointype 
19a80 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63  = 0;.    pSubSrc
19a90 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20   = pSub->pSrc;  
19aa0 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
19ab0 65 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f  e of subquery */
19ac0 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70  .    nSubSrc = p
19ad0 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f  SubSrc->nSrc;  /
19ae0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
19af0 73 20 69 6e 20 73 75 62 71 75 65 72 79 20 46 52  s in subquery FR
19b00 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
19b10 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
19b20 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52  >pSrc;     /* FR
19b30 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
19b40 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
19b50 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29 7b  .    if( pSrc ){
19b60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19b70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a  Parent==p );  /*
19b80 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f   First time thro
19b90 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
19ba0 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d        jointype =
19bb0 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74   pSubitem->joint
19bc0 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ype;.    }else{.
19bd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
19be0 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20  arent!=p );  /* 
19bf0 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  2nd and subseque
19c00 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68  nt times through
19c10 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
19c20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e     pSrc = pParen
19c30 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  t->pSrc = sqlite
19c40 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64  3SrcListAppend(d
19c50 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  b, 0, 0, 0);.   
19c60 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29     if( pSrc==0 )
19c70 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
19c80 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
19c90 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ed );.        br
19ca0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
19cb0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73   }..    /* The s
19cc0 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20 73  ubquery uses a s
19cd0 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68  ingle slot of th
19ce0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
19cf0 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a   the outer.    *
19d00 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68 65  * query.  If the
19d10 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f   subquery has mo
19d20 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d  re than one elem
19d30 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ent in its FROM 
19d40 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74  clause,.    ** t
19d50 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f  hen expand the o
19d60 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61  uter query to ma
19d70 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 20  ke space for it 
19d80 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d  to hold all elem
19d90 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ents.    ** of t
19da0 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20  he subquery..   
19db0 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70   **.    ** Examp
19dc0 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
19dd0 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
19de0 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54  OM tabA, (SELECT
19df0 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75   * FROM sub1, su
19e00 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a  b2), tabB;.    *
19e10 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74  *.    ** The out
19e20 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20 73  er query has 3 s
19e30 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d  lots in its FROM
19e40 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c   clause.  One sl
19e50 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ot of the.    **
19e60 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74 68   outer query (th
19e70 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69  e middle slot) i
19e80 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 75  s used by the su
19e90 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78  bquery.  The nex
19ea0 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f  t.    ** block o
19eb0 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61  f code will expa
19ec0 6e 64 20 74 68 65 20 6f 75 74 20 71 75 65 72 79  nd the out query
19ed0 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20 20 54 68   to 4 slots.  Th
19ee0 65 20 6d 69 64 64 6c 65 0a 20 20 20 20 2a 2a 20  e middle.    ** 
19ef0 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64  slot is expanded
19f00 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e   to two slots in
19f10 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73   order to make s
19f20 70 61 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20  pace for the.   
19f30 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73   ** two elements
19f40 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
19f50 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
19f60 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
19f70 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b  if( nSubSrc>1 ){
19f80 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
19f90 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71  pSrc = pSrc = sq
19fa0 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
19fb0 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53  rge(db, pSrc, nS
19fc0 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29  ubSrc-1,iFrom+1)
19fd0 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
19fe0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
19ff0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1a000 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1a010 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68    /* Transfer th
1a020 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
1a030 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62  rms from the sub
1a040 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
1a050 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
1a060 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  y..    */.    fo
1a070 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63  r(i=0; i<nSubSrc
1a080 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
1a090 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
1a0a0 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b  e(db, pSrc->a[i+
1a0b0 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a  iFrom].pUsing);.
1a0c0 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b        pSrc->a[i+
1a0d0 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63  iFrom] = pSubSrc
1a0e0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65  ->a[i];.      me
1a0f0 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
1a100 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
1a110 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
1a120 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
1a130 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70  a[iFrom].jointyp
1a140 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  e = jointype;.  
1a150 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69  .    /* Now begi
1a160 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73  n substituting s
1a170 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73  ubquery result s
1a180 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66  et expressions f
1a190 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  or .    ** refer
1a1a0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61  ences to the iPa
1a1b0 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65  rent in the oute
1a1c0 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20  r query..    ** 
1a1d0 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
1a1e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1a1f0 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31   SELECT a+5, b*1
1a200 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  0 FROM (SELECT x
1a210 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53  *3 AS a, y+10 AS
1a220 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   b FROM t1) WHER
1a230 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20  E a>b;.    **   
1a240 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
1a250 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
1a260 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f  ____ subquery __
1a270 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20  ________/       
1a280 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c     /.    **    \
1a290 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1a2a0 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72  _____ outer quer
1a2b0 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  y ______________
1a2c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1a2d0 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  /.    **.    ** 
1a2e0 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79  We look at every
1a2f0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
1a300 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
1a310 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
1a320 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22  e see.    ** "a"
1a330 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
1a340 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70  x*3" and every p
1a350 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20  lace we see "b" 
1a360 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79  we substitute "y
1a370 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  +10"..    */.   
1a380 20 70 4c 69 73 74 20 3d 20 70 50 61 72 65 6e 74   pList = pParent
1a390 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f  ->pEList;.    fo
1a3a0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1a3b0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1a3c0 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
1a3d0 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  i].zName==0 ){. 
1a3e0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
1a3f0 72 20 2a 7a 53 70 61 6e 20 3d 20 70 4c 69 73 74  r *zSpan = pList
1a400 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20  ->a[i].zSpan;.  
1a410 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
1a420 28 7a 53 70 61 6e 29 20 29 7b 0a 20 20 20 20 20  (zSpan) ){.     
1a430 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d       pList->a[i]
1a440 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
1a450 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 53 70  DbStrDup(db, zSp
1a460 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  an);.        }. 
1a470 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a480 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1a490 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69  b, pParent->pELi
1a4a0 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  st, iParent, pSu
1a4b0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
1a4c0 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20  if( isAgg ){.   
1a4d0 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1a4e0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47  (db, pParent->pG
1a4f0 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c  roupBy, iParent,
1a500 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
1a510 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1a520 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
1a530 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
1a540 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
1a550 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
1a560 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1a570 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
1a580 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a590 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
1a5a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
1a5b0 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d  rent->pOrderBy =
1a5c0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b   pSub->pOrderBy;
1a5d0 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72  .      pSub->pOr
1a5e0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d  derBy = 0;.    }
1a5f0 65 6c 73 65 20 69 66 28 20 70 50 61 72 65 6e 74  else if( pParent
1a600 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1a610 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1a620 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  t(db, pParent->p
1a630 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74  OrderBy, iParent
1a640 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
1a650 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1a660 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  Sub->pWhere ){. 
1a670 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71       pWhere = sq
1a680 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
1a690 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30   pSub->pWhere, 0
1a6a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1a6b0 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a      pWhere = 0;.
1a6c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 75      }.    if( su
1a6d0 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
1a6e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1a6f0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  rent->pHaving==0
1a700 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
1a710 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61  t->pHaving = pPa
1a720 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20  rent->pWhere;.  
1a730 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
1a740 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
1a750 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
1a760 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72  ving = substExpr
1a770 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48  (db, pParent->pH
1a780 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
1a790 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1a7a0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
1a7b0 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
1a7c0 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65  xprAnd(db, pPare
1a7d0 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20  nt->pHaving, .  
1a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a800 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1a810 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67  b, pSub->pHaving
1a820 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61 73 73  , 0));.      ass
1a830 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47  ert( pParent->pG
1a840 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
1a850 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f     pParent->pGro
1a860 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
1a870 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53  prListDup(db, pS
1a880 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30 29  ub->pGroupBy, 0)
1a890 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a8a0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
1a8b0 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  re = substExpr(d
1a8c0 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65  b, pParent->pWhe
1a8d0 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  re, iParent, pSu
1a8e0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
1a8f0 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
1a900 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
1a910 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  nd(db, pParent->
1a920 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b  pWhere, pWhere);
1a930 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
1a940 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
1a950 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
1a960 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
1a970 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20  nner or the.    
1a980 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  ** outer query i
1a990 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20  s distinct. .   
1a9a0 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d   */.    pParent-
1a9b0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75  >selFlags |= pSu
1a9c0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
1a9d0 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20  _Distinct;.  .  
1a9e0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45    /*.    ** SELE
1a9f0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c  CT ... FROM (SEL
1aa00 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20  ECT ... LIMIT a 
1aa10 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20  OFFSET b) LIMIT 
1aa20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20  x OFFSET y;.    
1aa30 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73  **.    ** One is
1aa40 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20   tempted to try 
1aa50 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74  to add a and b t
1aa60 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69  o combine the li
1aa70 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a  mits.  But this.
1aa80 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
1aa90 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c  work if either l
1aaa0 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
1aab0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1aac0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
1aad0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1aae0 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
1aaf0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75  Limit;.      pSu
1ab00 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
1ab10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1ab20 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20  inially, delete 
1ab30 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20  what is left of 
1ab40 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  the subquery and
1ab50 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63   return.  ** suc
1ab60 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  cess..  */.  sql
1ab70 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
1ab80 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 20 20  (db, pSub1);..  
1ab90 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
1aba0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
1abb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1abc0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1abd0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1abe0 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  W) */../*.** Ana
1abf0 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20  lyze the SELECT 
1ac00 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
1ac10 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
1ac20 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20  to see if it.** 
1ac30 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61  is a min() or ma
1ac40 78 28 29 20 71 75 65 72 79 2e 20 52 65 74 75 72  x() query. Retur
1ac50 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  n WHERE_ORDERBY_
1ac60 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44  MIN or WHERE_ORD
1ac70 45 52 42 59 5f 4d 41 58 20 69 66 20 0a 2a 2a 20  ERBY_MAX if .** 
1ac80 69 74 20 69 73 2c 20 6f 72 20 30 20 6f 74 68 65  it is, or 0 othe
1ac90 72 77 69 73 65 2e 20 41 74 20 70 72 65 73 65 6e  rwise. At presen
1aca0 74 2c 20 61 20 71 75 65 72 79 20 69 73 20 63 6f  t, a query is co
1acb0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 0a 2a  nsidered to be.*
1acc0 2a 20 61 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20  * a min()/max() 
1acd0 71 75 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  query if:.**.** 
1ace0 20 20 31 2e 20 54 68 65 72 65 20 69 73 20 61 20    1. There is a 
1acf0 73 69 6e 67 6c 65 20 6f 62 6a 65 63 74 20 69 6e  single object in
1ad00 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1ad10 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65  ..**.**   2. The
1ad20 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20 65  re is a single e
1ad30 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
1ad40 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64   result set, and
1ad50 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 65   it is.**      e
1ad60 69 74 68 65 72 20 6d 69 6e 28 78 29 20 6f 72 20  ither min(x) or 
1ad70 6d 61 78 28 78 29 2c 20 77 68 65 72 65 20 78 20  max(x), where x 
1ad80 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65  is a column refe
1ad90 72 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rence..*/.static
1ada0 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28   u8 minMaxQuery(
1adb0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 45 78  Select *p){.  Ex
1adc0 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70  pr *pExpr;.  Exp
1add0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
1ade0 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66  p->pEList;..  if
1adf0 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ( pEList->nExpr!
1ae00 3d 31 20 29 20 72 65 74 75 72 6e 20 57 48 45 52  =1 ) return WHER
1ae10 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
1ae20 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69  ;.  pExpr = pELi
1ae30 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
1ae40 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
1ae50 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
1ae60 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1ae70 66 28 20 4e 45 56 45 52 28 45 78 70 72 48 61 73  f( NEVER(ExprHas
1ae80 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1ae90 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29 20 29  EP_xIsSelect)) )
1aea0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c   return 0;.  pEL
1aeb0 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
1aec0 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69  List;.  if( pELi
1aed0 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d  st==0 || pEList-
1aee0 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
1aef0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 4c 69  rn 0;.  if( pELi
1af00 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  st->a[0].pExpr->
1af10 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op!=TK_AGG_COLUM
1af20 4e 20 29 20 72 65 74 75 72 6e 20 57 48 45 52 45  N ) return WHERE
1af30 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
1af40 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
1af50 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1af60 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
1af70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1af80 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75  StrICmp(pExpr->u
1af90 2e 7a 54 6f 6b 65 6e 2c 22 6d 69 6e 22 29 3d 3d  .zToken,"min")==
1afa0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1afb0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
1afc0 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  N;.  }else if( s
1afd0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
1afe0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d  xpr->u.zToken,"m
1aff0 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ax")==0 ){.    r
1b000 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45  eturn WHERE_ORDE
1b010 52 42 59 5f 4d 41 58 3b 0a 20 20 7d 0a 20 20 72  RBY_MAX;.  }.  r
1b020 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45  eturn WHERE_ORDE
1b030 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a 2f  RBY_NORMAL;.}../
1b040 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20  *.** The select 
1b050 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
1b060 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
1b070 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67  gument is an agg
1b080 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a  regate query..**
1b090 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 6d   The second argm
1b0a0 65 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63  ent is the assoc
1b0b0 69 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d  iated aggregate-
1b0c0 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69  info object. Thi
1b0d0 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74  s .** function t
1b0e0 65 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45  ests if the SELE
1b0f0 43 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  CT is of the for
1b100 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  m:.**.**   SELEC
1b110 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1b120 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72  <tbl>.**.** wher
1b130 65 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74  e table is a dat
1b140 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74  abase table, not
1b150 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72   a sub-select or
1b160 20 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75   view. If the qu
1b170 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63  ery.** does matc
1b180 68 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20  h this pattern, 
1b190 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  then a pointer t
1b1a0 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  o the Table obje
1b1b0 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a  ct representing.
1b1c0 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75  ** <tbl> is retu
1b1d0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
1b1e0 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a   0 is returned..
1b1f0 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20  */.static Table 
1b200 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53  *isSimpleCount(S
1b210 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66  elect *p, AggInf
1b220 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
1b230 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45  Table *pTab;.  E
1b240 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61  xpr *pExpr;..  a
1b250 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75  ssert( !p->pGrou
1b260 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d  pBy );..  if( p-
1b270 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45  >pWhere || p->pE
1b280 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a  List->nExpr!=1 .
1b290 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e     || p->pSrc->n
1b2a0 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72  Src!=1 || p->pSr
1b2b0 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a  c->a[0].pSelect.
1b2c0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1b2d0 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20  0;.  }.  pTab = 
1b2e0 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
1b2f0 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d  ab;.  pExpr = p-
1b300 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
1b310 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  xpr;.  assert( p
1b320 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53  Tab && !pTab->pS
1b330 65 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29  elect && pExpr )
1b340 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  ;..  if( IsVirtu
1b350 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
1b360 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
1b370 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
1b380 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30  CTION ) return 0
1b390 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66  ;.  if( (pAggInf
1b3a0 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e  o->aFunc[0].pFun
1b3b0 63 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  c->flags&SQLITE_
1b3c0 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29  FUNC_COUNT)==0 )
1b3d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1b3e0 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50   pExpr->flags&EP
1b3f0 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75  _Distinct ) retu
1b400 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20  rn 0;..  return 
1b410 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pTab;.}../*.** I
1b420 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
1b430 74 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73  t item passed as
1b440 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73   an argument was
1b450 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20   augmented with 
1b460 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59  an.** INDEXED BY
1b470 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72   clause, then tr
1b480 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  y to locate the 
1b490 73 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e  specified index.
1b4a0 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73   If there.** was
1b4b0 20 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61   such a clause a
1b4c0 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  nd the named ind
1b4d0 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ex cannot be fou
1b4e0 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  nd, return .** S
1b4f0 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20  QLITE_ERROR and 
1b500 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69  leave an error i
1b510 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77  n pParse. Otherw
1b520 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a  ise, populate .*
1b530 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20  * pFrom->pIndex 
1b540 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
1b550 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
1b560 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f  ite3IndexedByLoo
1b570 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  kup(Parse *pPars
1b580 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  e, struct SrcLis
1b590 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a  t_item *pFrom){.
1b5a0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61    if( pFrom->pTa
1b5b0 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64  b && pFrom->zInd
1b5c0 65 78 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  ex ){.    Table 
1b5d0 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
1b5e0 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Tab;.    char *z
1b5f0 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a  Index = pFrom->z
1b600 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78  Index;.    Index
1b610 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
1b620 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
1b630 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  x; .        pIdx
1b640 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
1b650 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  mp(pIdx->zName, 
1b660 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20  zIndex); .      
1b670 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65    pIdx=pIdx->pNe
1b680 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  xt.    );.    if
1b690 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20  ( !pIdx ){.     
1b6a0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1b6b0 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
1b6c0 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49  h index: %s", zI
1b6d0 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  ndex, 0);.      
1b6e0 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
1b6f0 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  ema = 1;.      r
1b700 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1b710 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  OR;.    }.    pF
1b720 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  rom->pIndex = pI
1b730 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
1b740 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1b750 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b760 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61  e is a Walker ca
1b770 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61  llback for "expa
1b780 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20  nding" a SELECT 
1b790 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45  statement..** "E
1b7a0 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20  xpanding" means 
1b7b0 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  to do the follow
1b7c0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ing:.**.**    (1
1b7d0 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42  )  Make sure VDB
1b7e0 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
1b7f0 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
1b800 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20  ned to every.** 
1b810 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20          element 
1b820 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1b830 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
1b840 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54    Fill in the pT
1b850 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62  abList->a[].pTab
1b860 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53   fields in the S
1b870 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20  rcList that .** 
1b880 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20          defines 
1b890 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68  FROM clause.  Wh
1b8a0 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20  en views appear 
1b8b0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1b8c0 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  se,.**         f
1b8d0 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ill pTabList->a[
1b8e0 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61  ].pSelect with a
1b8f0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
1b900 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
1b910 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d           that im
1b920 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
1b930 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61  w.  A copy is ma
1b940 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73  de of the view's
1b950 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
1b960 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20     statement so 
1b970 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65  that we can free
1b980 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c  ly modify or del
1b990 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ete that stateme
1b9a0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69  nt.**         wi
1b9b0 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61  thout worrying a
1b9c0 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20  bout messing up 
1b9d0 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20 72  the presistent r
1b9e0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a  epresentation.**
1b9f0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
1ba00 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  view..**.**    (
1ba10 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f  3)  Add terms to
1ba20 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1ba30 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20  e to accomodate 
1ba40 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
1ba50 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ord.**         o
1ba60 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20  n joins and the 
1ba70 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
1ba80 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a  use of joins..**
1ba90 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e  .**    (4)  Scan
1baa0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c   the list of col
1bab0 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
1bac0 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20  lt set (pEList) 
1bad0 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  looking.**      
1bae0 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73     for instances
1baf0 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72   of the "*" oper
1bb00 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c  ator or the TABL
1bb10 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  E.* operator..**
1bb20 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e           If foun
1bb30 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22  d, expand each "
1bb40 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  *" to be every c
1bb50 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74  olumn in every t
1bb60 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  able.**         
1bb70 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62  and TABLE.* to b
1bb80 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
1bb90 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73  n TABLE..**.*/.s
1bba0 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
1bbb0 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20  Expander(Walker 
1bbc0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
1bbd0 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
1bbe0 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
1bbf0 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69  >pParse;.  int i
1bc00 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73  , j, k;.  SrcLis
1bc10 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45  t *pTabList;.  E
1bc20 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
1bc30 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1bc40 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20  t_item *pFrom;. 
1bc50 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1bc60 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
1bc70 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1bc80 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ed  ){.    retur
1bc90 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
1bca0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e  .  if( NEVER(p->
1bcb0 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 70 2d 3e  pSrc==0) || (p->
1bcc0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78  selFlags & SF_Ex
1bcd0 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20  panded)!=0 ){.  
1bce0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
1bcf0 6e 65 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73 65 6c  ne;.  }.  p->sel
1bd00 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61  Flags |= SF_Expa
1bd10 6e 64 65 64 3b 0a 20 20 70 54 61 62 4c 69 73 74  nded;.  pTabList
1bd20 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
1bd30 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
1bd40 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
1bd50 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1bd60 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
1bd70 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69  ned to all entri
1bd80 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46  es in.  ** the F
1bd90 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1bda0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1bdb0 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  nt..  */.  sqlit
1bdc0 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
1bdd0 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
1bde0 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20  TabList);..  /* 
1bdf0 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61  Look up every ta
1be00 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65  ble named in the
1be10 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1be20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a  the select.  If.
1be30 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66    ** an entry of
1be40 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1be50 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69   is a subquery i
1be60 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c  nstead of a tabl
1be70 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20  e or view,.  ** 
1be80 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72  then create a tr
1be90 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74  ansient table st
1bea0 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72  ructure to descr
1beb0 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ibe the subquery
1bec0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
1bed0 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
1bee0 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
1bef0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
1bf00 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
1bf10 2a 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  *pTab;.    if( p
1bf20 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b  From->pTab!=0 ){
1bf30 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
1bf40 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72  tatement has alr
1bf50 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72  eady been prepar
1bf60 65 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ed.  There is no
1bf70 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74   need.      ** t
1bf80 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f  o go further. */
1bf90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1bfa0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  ==0 );.      ret
1bfb0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
1bfc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72     }.    if( pFr
1bfd0 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  om->zName==0 ){.
1bfe0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1bff0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
1c000 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20     Select *pSel 
1c010 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
1c020 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  ;.      /* A sub
1c030 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
1c040 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
1c050 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61  ELECT */.      a
1c060 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29  ssert( pSel!=0 )
1c070 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c080 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
1c090 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  ;.      sqlite3W
1c0a0 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
1c0b0 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20  r, pSel);.      
1c0c0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
1c0d0 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
1c0e0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
1c0f0 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20  eof(Table));.   
1c100 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
1c110 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
1c120 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  t;.      pTab->n
1c130 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  Ref = 1;.      p
1c140 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Tab->zName = sql
1c150 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1c160 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79  "sqlite_subquery
1c170 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 54  _%p_", (void*)pT
1c180 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ab);.      while
1c190 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
1c1a0 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70  { pSel = pSel->p
1c1b0 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73  Prior; }.      s
1c1c0 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d  electColumnsFrom
1c1d0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1c1e0 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26   pSel->pEList, &
1c1f0 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  pTab->nCol, &pTa
1c200 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20  b->aCol);.      
1c210 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
1c220 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  ;.      pTab->nR
1c230 6f 77 45 73 74 20 3d 20 31 30 30 30 30 30 30 3b  owEst = 1000000;
1c240 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62  .      pTab->tab
1c250 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
1c260 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20  meral;.#endif.  
1c270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
1c280 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  * An ordinary ta
1c290 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
1c2a0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1c2b0 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  use */.      ass
1c2c0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
1c2d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72  ==0 );.      pFr
1c2e0 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
1c2f0 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  = .        sqlit
1c300 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
1c310 61 72 73 65 2c 30 2c 70 46 72 6f 6d 2d 3e 7a 4e  arse,0,pFrom->zN
1c320 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61  ame,pFrom->zData
1c330 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  base);.      if(
1c340 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
1c350 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
1c360 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b     pTab->nRef++;
1c370 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1c380 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
1c390 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c  || !defined (SQL
1c3a0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1c3b0 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28  TABLE).      if(
1c3c0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c   pTab->pSelect |
1c3d0 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  | IsVirtual(pTab
1c3e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1c3f0 57 65 20 72 65 61 63 68 20 68 65 72 65 20 69 66  We reach here if
1c400 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
1c410 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76   is a really a v
1c420 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  iew */.        i
1c430 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  f( sqlite3ViewGe
1c440 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
1c450 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74  rse, pTab) ) ret
1c460 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
1c470 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1c480 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  From->pSelect==0
1c490 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f   );.        pFro
1c4a0 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
1c4b0 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
1c4c0 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c  , pTab->pSelect,
1c4d0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
1c4e0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
1c4f0 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70  Walker, pFrom->p
1c500 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d  Select);.      }
1c510 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
1c520 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65     /* Locate the
1c530 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20   index named by 
1c540 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63  the INDEXED BY c
1c550 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a  lause, if any. *
1c560 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
1c570 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
1c580 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
1c590 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1c5a0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
1c5b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
1c5c0 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
1c5d0 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
1c5e0 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
1c5f0 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
1c600 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1c610 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f  led || sqlitePro
1c620 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
1c630 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   p) ){.    retur
1c640 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
1c650 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79  ..  /* For every
1c660 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73   "*" that occurs
1c670 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
1c680 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20  ist, insert the 
1c690 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c  names of.  ** al
1c6a0 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
1c6b0 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f   tables.  And fo
1c6c0 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20  r every TABLE.* 
1c6d0 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
1c6e0 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c  .  ** of all col
1c6f0 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20  umns in TABLE.  
1c700 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72  The parser inser
1c710 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78  ted a special ex
1c720 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69  pression.  ** wi
1c730 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70  th the TK_ALL op
1c740 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
1c750 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
1c760 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
1c770 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66  list..  ** The f
1c780 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
1c790 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
1c7a0 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72   the TK_ALL expr
1c7b0 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61  essions and expa
1c7c0 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65  nd.  ** each one
1c7d0 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
1c7e0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
1c7f0 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ll tables..  **.
1c800 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c    ** The first l
1c810 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20  oop just checks 
1c820 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
1c830 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72  are any "*" oper
1c840 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20  ators.  ** that 
1c850 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a  need expanding..
1c860 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20    */.  for(k=0; 
1c870 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
1c880 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   k++){.    Expr 
1c890 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  *pE = pEList->a[
1c8a0 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
1c8b0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ( pE->op==TK_ALL
1c8c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
1c8d0 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b  sert( pE->op!=TK
1c8e0 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67  _DOT || pE->pRig
1c8f0 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ht!=0 );.    ass
1c900 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
1c910 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66  DOT || (pE->pLef
1c920 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66  t!=0 && pE->pLef
1c930 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b  t->op==TK_ID) );
1c940 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
1c950 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
1c960 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  Right->op==TK_AL
1c970 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  L ) break;.  }. 
1c980 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e   if( k<pEList->n
1c990 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  Expr ){.    /*. 
1c9a0 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20     ** If we get 
1c9b0 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68  here it means th
1c9c0 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e  e result set con
1c9d0 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
1c9e0 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65  e "*".    ** ope
1c9f0 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  rators that need
1ca00 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
1ca10 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65    Loop through e
1ca20 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ach expression. 
1ca30 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73     ** in the res
1ca40 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61  ult set and expa
1ca50 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f  nd them one by o
1ca60 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ne..    */.    s
1ca70 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1ca80 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d  tem *a = pEList-
1ca90 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  >a;.    ExprList
1caa0 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
1cab0 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72  int flags = pPar
1cac0 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  se->db->flags;. 
1cad0 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73     int longNames
1cae0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
1caf0 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
1cb00 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
1cb10 20 20 20 20 20 20 20 20 20 20 26 26 20 28 66 6c            && (fl
1cb20 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
1cb30 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a  rtColNames)==0;.
1cb40 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  .    for(k=0; k<
1cb50 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
1cb60 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
1cb70 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72  *pE = a[k].pExpr
1cb80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1cb90 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
1cba0 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20  | pE->pRight!=0 
1cbb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
1cbc0 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28  >op!=TK_ALL && (
1cbd0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
1cbe0 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  | pE->pRight->op
1cbf0 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20  !=TK_ALL) ){.   
1cc00 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72       /* This par
1cc10 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69  ticular expressi
1cc20 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
1cc30 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
1cc40 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1cc50 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1cc60 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
1cc70 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61  (pParse, pNew, a
1cc80 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [k].pExpr);.    
1cc90 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
1cca0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1ccb0 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
1ccc0 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e  .zName = a[k].zN
1ccd0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ame;.          p
1cce0 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
1ccf0 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b  pr-1].zSpan = a[
1cd00 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20  k].zSpan;.      
1cd10 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d      a[k].zName =
1cd20 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b   0;.          a[
1cd30 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20  k].zSpan = 0;.  
1cd40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1cd50 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
1cd60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1cd70 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70       /* This exp
1cd80 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22  ression is a "*"
1cd90 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20   or a "TABLE.*" 
1cda0 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  and needs to be.
1cdb0 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e          ** expan
1cdc0 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ded. */.        
1cdd0 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20  int tableSeen = 
1cde0 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  0;      /* Set t
1cdf0 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d  o 1 when TABLE m
1ce00 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
1ce10 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20    char *zTName; 
1ce20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65             /* te
1ce30 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
1ce40 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
1ce50 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
1ce60 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  T ){.          a
1ce70 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74  ssert( pE->pLeft
1ce80 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
1ce90 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1cea0 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c  sProperty(pE->pL
1ceb0 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  eft, EP_IntValue
1cec0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) );.          z
1ced0 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66  TName = pE->pLef
1cee0 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  t->u.zToken;.   
1cef0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1cf00 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30        zTName = 0
1cf10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1cf20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
1cf30 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
1cf40 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
1cf50 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
1cf60 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65  .          Table
1cf70 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
1cf80 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
1cf90 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
1cfa0 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a   pFrom->zAlias;.
1cfb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
1cfc0 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  abName==0 ){.   
1cfd0 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d           zTabNam
1cfe0 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
1cff0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1d000 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
1d010 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72  allocFailed ) br
1d020 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eak;.          i
1d030 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c  f( zTName && sql
1d040 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61  ite3StrICmp(zTNa
1d050 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30  me, zTabName)!=0
1d060 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d070 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1d080 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d090 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20  tableSeen = 1;. 
1d0a0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
1d0b0 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
1d0c0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
1d0d0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a    Expr *pExpr, *
1d0e0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
1d0f0 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
1d100 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
1d110 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
1d120 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d     char *zColnam
1d130 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75  e;  /* The compu
1d140 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ted column name 
1d150 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  */.            c
1d160 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20  har *zToFree;   
1d170 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69  /* Malloced stri
1d180 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ng that needs to
1d190 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20   be freed */.   
1d1a0 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73           Token s
1d1b0 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d  Colname;  /* Com
1d1c0 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  puted column nam
1d1d0 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a  e as a token */.
1d1e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1d1f0 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d  If a column is m
1d200 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e  arked as 'hidden
1d210 27 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c  ' (currently onl
1d220 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20  y possible.     
1d230 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69         ** for vi
1d240 72 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64  rtual tables), d
1d250 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74  o not include it
1d260 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64   in the expanded
1d270 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1d280 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e  result-set list.
1d290 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
1d2a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1d2b0 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26  IsHiddenColumn(&
1d2c0 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29  pTab->aCol[j]) )
1d2d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1d2e0 61 73 73 65 72 74 28 49 73 56 69 72 74 75 61 6c  assert(IsVirtual
1d2f0 28 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20  (pTab));.       
1d300 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1d310 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  .            }..
1d320 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1d330 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30  i>0 && zTName==0
1d340 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d350 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f    if( (pFrom->jo
1d360 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
1d370 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20  RAL)!=0.        
1d380 20 20 20 20 20 20 20 20 26 26 20 74 61 62 6c 65          && table
1d390 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
1d3a0 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d  TabList, i, zNam
1d3b0 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20  e, 0, 0).       
1d3c0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
1d3d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
1d3e0 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20  a NATURAL join, 
1d3f0 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f  omit the join co
1d400 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a  lumns from the .
1d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d420 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  ** table to the 
1d430 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69  right of the joi
1d440 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
1d450 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1d460 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1d470 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1d480 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
1d490 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e  dex(pFrom->pUsin
1d4a0 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
1d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4c0 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74  /* In a join wit
1d4d0 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  h a USING clause
1d4e0 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69  , omit columns i
1d4f0 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
1d500 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
1d510 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
1d520 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
1d530 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
1d540 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1d550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1d560 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1d570 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
1d580 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
1d590 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29  b, TK_ID, zName)
1d5a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43  ;.            zC
1d5b0 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  olname = zName;.
1d5c0 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46              zToF
1d5d0 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ree = 0;.       
1d5e0 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
1d5f0 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e  es || pTabList->
1d600 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSrc>1 ){.      
1d610 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
1d620 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eft;.           
1d630 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
1d640 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
1d650 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20  , zTabName);.   
1d660 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1d670 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
1d680 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
1d690 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30  pLeft, pRight, 0
1d6a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1d6b0 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29   if( longNames )
1d6c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1d6d0 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c    zColname = sql
1d6e0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1d6f0 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d  "%s.%s", zTabNam
1d700 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
1d710 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
1d720 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20  ee = zColname;. 
1d730 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1d740 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
1d750 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1d760 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
1d770 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1d780 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
1d790 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1d7a0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
1d7b0 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
1d7c0 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d           sColnam
1d7d0 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a  e.z = zColname;.
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c              sCol
1d7f0 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33  name.n = sqlite3
1d800 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d  Strlen30(zColnam
1d810 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1d820 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
1d830 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  etName(pParse, p
1d840 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20  New, &sColname, 
1d850 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
1d860 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1d870 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  , zToFree);.    
1d880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d890 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74  }.        if( !t
1d8a0 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20  ableSeen ){.    
1d8b0 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
1d8c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d8d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1d8e0 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1d8f0 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e   table: %s", zTN
1d900 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
1d910 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1d920 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1d930 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74  sg(pParse, "no t
1d940 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22  ables specified"
1d950 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1d960 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1d970 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1d980 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
1d990 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  (db, pEList);.  
1d9a0 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e    p->pEList = pN
1d9b0 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  ew;.  }.#if SQLI
1d9c0 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20  TE_MAX_COLUMN.  
1d9d0 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  if( p->pEList &&
1d9e0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
1d9f0 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
1da00 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
1da10 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
1da20 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1da30 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
1da40 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
1da50 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ");.  }.#endif. 
1da60 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1da70 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  inue;.}../*.** N
1da80 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72  o-op routine for
1da90 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20   the parse-tree 
1daa0 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  walker..**.** Wh
1dab0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1dac0 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45  is the Walker.xE
1dad0 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
1dae0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
1daf0 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20  s.** are walked 
1db00 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69  without any acti
1db10 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20  ons being taken 
1db20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50  at each node.  P
1db30 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68  resumably,.** wh
1db40 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1db50 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b  is used for Walk
1db60 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
1db70 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72   then .** Walker
1db80 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
1db90 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f   is set to do so
1dba0 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66  mething useful f
1dbb0 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62  or every .** sub
1dbc0 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72  query in the par
1dbd0 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61  ser tree..*/.sta
1dbe0 74 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b  tic int exprWalk
1dbf0 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  Noop(Walker *Not
1dc00 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55  Used, Expr *NotU
1dc10 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
1dc20 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
1dc30 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
1dc40 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1dc50 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  inue;.}../*.** T
1dc60 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70  his routine "exp
1dc70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73  ands" a SELECT s
1dc80 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c  tatement and all
1dc90 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69   of its subqueri
1dca0 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74  es..** For addit
1dcb0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
1dcc0 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61  n on what it mea
1dcd0 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61  ns to "expand" a
1dce0 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
1dcf0 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f  ment, see the co
1dd00 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c  mment on the sel
1dd10 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72  ectExpand worker
1dd20 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e   callback above.
1dd30 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67  .**.** Expanding
1dd40 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
1dd50 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
1dd60 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73   step in process
1dd70 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20  ing a.** SELECT 
1dd80 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
1dd90 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1dda0 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65   must be expande
1ddb0 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65  d before.** name
1ddc0 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70   resolution is p
1ddd0 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20  erformed..**.** 
1dde0 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
1ddf0 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72   wrong, an error
1de00 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
1de10 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e  ten into pParse.
1de20 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
1de30 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74  function can det
1de40 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ect the problem 
1de50 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50  by looking at pP
1de60 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e  arse->nErr.** an
1de70 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d  d/or pParse->db-
1de80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a  >mallocFailed..*
1de90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
1dea0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
1deb0 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
1dec0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
1ded0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
1dee0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
1def0 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e  ck = selectExpan
1df00 64 65 72 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  der;.  w.xExprCa
1df10 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c  llback = exprWal
1df20 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
1df30 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
1df40 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
1df50 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a  &w, pSelect);.}.
1df60 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1df70 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
1df80 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57  *.** This is a W
1df90 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
1dfa0 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66  lback callback f
1dfb0 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65  or the sqlite3Se
1dfc0 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a  lectTypeInfo().*
1dfd0 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a  * interface..**.
1dfe0 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d  ** For each FROM
1dff0 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79  -clause subquery
1e000 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79  , add Column.zTy
1e010 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43  pe and Column.zC
1e020 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  oll.** informati
1e030 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  on to the Table 
1e040 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
1e050 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
1e060 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74  sult set.** of t
1e070 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a  hat subquery..**
1e080 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
1e090 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
1e0a0 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
1e0b0 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74  lt set was const
1e0c0 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c  ructed.** by sel
1e0d0 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75  ectExpander() bu
1e0e0 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63  t the type and c
1e0f0 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  ollation informa
1e100 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64  tion was omitted
1e110 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e  .** at that poin
1e120 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69  t because identi
1e130 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65  fiers had not ye
1e140 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  t been resolved.
1e150 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
1e160 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  e is called afte
1e170 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73  r identifier res
1e180 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
1e190 69 63 20 69 6e 74 20 73 65 6c 65 63 74 41 64 64  ic int selectAdd
1e1a0 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
1e1b0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
1e1c0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
1e1d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
1e1e0 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73   int i;.  SrcLis
1e1f0 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  t *pTabList;.  s
1e200 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1e210 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73  em *pFrom;..  as
1e220 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
1e230 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20  s & SF_Resolved 
1e240 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  );.  if( (p->sel
1e250 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79  Flags & SF_HasTy
1e260 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20  peInfo)==0 ){.  
1e270 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
1e280 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b   SF_HasTypeInfo;
1e290 0a 20 20 20 20 70 50 61 72 73 65 20 3d 20 70 57  .    pParse = pW
1e2a0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
1e2b0 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
1e2c0 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69  >pSrc;.    for(i
1e2d0 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
1e2e0 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
1e2f0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
1e300 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61  rom++){.      Ta
1e310 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
1e320 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  m->pTab;.      i
1e330 66 28 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d  f( ALWAYS(pTab!=
1e340 30 29 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62  0) && (pTab->tab
1e350 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
1e360 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  eral)!=0 ){.    
1e370 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
1e380 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
1e390 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
1e3a0 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c  T */.        Sel
1e3b0 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
1e3c0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
1e3d0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c      assert( pSel
1e3e0 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   );.        whil
1e3f0 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20  e( pSel->pPrior 
1e400 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70  ) pSel = pSel->p
1e410 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73  Prior;.        s
1e420 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
1e430 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
1e440 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f  Parse, pTab->nCo
1e450 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70  l, pTab->aCol, p
1e460 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sel);.      }.  
1e470 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1e480 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
1e490 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
1e4a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
1e4b0 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63  s datatype and c
1e4c0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1e4d0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
1e4e0 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74  .** the Table st
1e4f0 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20  ructures of all 
1e500 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
1e510 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53  ueries in a.** S
1e520 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1e530 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20  .**.** Use this 
1e540 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61  routine after na
1e550 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  me resolution..*
1e560 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
1e570 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
1e580 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  peInfo(Parse *pP
1e590 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
1e5a0 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20  elect){.#ifndef 
1e5b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1e5c0 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b  UERY.  Walker w;
1e5d0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
1e5e0 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 41 64 64  back = selectAdd
1e5f0 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
1e600 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
1e610 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f  ack = exprWalkNo
1e620 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
1e630 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74   pParse;.  sqlit
1e640 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
1e650 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69   pSelect);.#endi
1e660 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  f.}.../*.** This
1e670 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 6f 66   routine sets of
1e680 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
1e690 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ent for processi
1e6a0 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c  ng.  The.** foll
1e6b0 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c  owing is accompl
1e6c0 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ished:.**.**    
1e6d0 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72 20   *  VDBE Cursor 
1e6e0 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73 73 69  numbers are assi
1e6f0 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d  gned to all FROM
1e700 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a  -clause terms..*
1e710 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72  *     *  Ephemer
1e720 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73  al Table objects
1e730 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72   are created for
1e740 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
1e750 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20   subqueries..** 
1e760 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53      *  ON and US
1e770 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20  ING clauses are 
1e780 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45  shifted into WHE
1e790 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  RE statements.**
1e7a0 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64       *  Wildcard
1e7b0 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45  s "*" and "TABLE
1e7c0 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65  .*" in result se
1e7d0 74 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e  ts are expanded.
1e7e0 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74  .**     *  Ident
1e7f0 69 66 69 65 72 73 20 69 6e 20 65 78 70 72 65 73  ifiers in expres
1e800 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64  sion are matched
1e810 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   to tables..**.*
1e820 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1e830 63 74 73 20 72 65 63 75 72 73 69 76 65 6c 79 20  cts recursively 
1e840 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65  on all subquerie
1e850 73 20 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c  s within the SEL
1e860 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ECT..*/.void sql
1e870 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a  ite3SelectPrep(.
1e880 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1e890 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e8a0 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
1e8b0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1e8c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e8d0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1e8e0 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
1e8f0 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
1e900 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e   *pOuterNC  /* N
1e910 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
1e920 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a  container */.){.
1e930 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1e940 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
1e950 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20   ) return;.  db 
1e960 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1e970 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
1e980 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
1e990 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
1e9a0 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
1e9b0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69  (pParse, p);.  i
1e9c0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1e9d0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1e9e0 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
1e9f0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
1ea00 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65  lectNames(pParse
1ea10 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a  , p, pOuterNC);.
1ea20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1ea30 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
1ea40 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
1ea50 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1ea60 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72  AddTypeInfo(pPar
1ea70 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  se, p);.}../*.**
1ea80 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65   Reset the aggre
1ea90 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
1eaa0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72  ..**.** The aggr
1eab0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
1eac0 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65  r is a set of me
1ead0 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20  mory cells that 
1eae0 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64  hold.** intermed
1eaf0 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69  iate results whi
1eb00 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61  le calculating a
1eb10 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  n aggregate.  Th
1eb20 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69  is.** routine si
1eb30 6d 70 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c  mply stores NULL
1eb40 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73  s in all of thos
1eb50 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a  e memory cells..
1eb60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
1eb70 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
1eb80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
1eb90 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1eba0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1ebb0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1ebc0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1ebd0 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
1ebe0 75 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49  unc;.  if( pAggI
1ebf0 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49  nfo->nFunc+pAggI
1ec00 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20  nfo->nColumn==0 
1ec10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1ec20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1ec30 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
1ec40 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  n; i++){.    sql
1ec50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ec60 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41  , OP_Null, 0, pA
1ec70 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e  ggInfo->aCol[i].
1ec80 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  iMem);.  }.  for
1ec90 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
1eca0 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
1ecb0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
1ecc0 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
1ecd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ece0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
1ecf0 20 30 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 29   0, pFunc->iMem)
1ed00 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d  ;.    if( pFunc-
1ed10 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
1ed20 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
1ed30 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a  = pFunc->pExpr;.
1ed40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1ed50 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1ed60 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  E, EP_xIsSelect)
1ed70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
1ed80 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
1ed90 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pE->x.pList->nEx
1eda0 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr!=1 ){.       
1edb0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1edc0 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
1edd0 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75  CT aggregates mu
1ede0 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20  st have exactly 
1edf0 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  one ".          
1ee00 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20   "argument");.  
1ee10 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69        pFunc->iDi
1ee20 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
1ee30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ee40 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1ee50 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
1ee60 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
1ee70 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  , pE->x.pList);.
1ee80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ee90 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1eea0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
1eeb0 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c  Func->iDistinct,
1eec0 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eee0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
1eef0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
1ef00 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20  DOFF);.      }. 
1ef10 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1ef20 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f  * Invoke the OP_
1ef30 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f  AggFinalize opco
1ef40 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67  de for every agg
1ef50 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a  regate function.
1ef60 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66  ** in the AggInf
1ef70 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  o structure..*/.
1ef80 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61  static void fina
1ef90 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
1efa0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1efb0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1efc0 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
1efd0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1efe0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1eff0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
1f000 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  F;.  for(i=0, pF
1f010 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
1f020 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
1f030 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
1f040 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1f050 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
1f060 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
1f070 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1f080 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
1f090 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1f0a0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
1f0b0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1f0c0 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d  AggFinal, pF->iM
1f0d0 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  em, pList ? pLis
1f0e0 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c  t->nExpr : 0, 0,
1f0f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f100 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46         (void*)pF
1f110 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
1f120 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  DEF);.  }.}../*.
1f130 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63  ** Update the ac
1f140 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79  cumulator memory
1f150 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67   cells for an ag
1f160 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e  gregate based on
1f170 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
1f180 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
1f190 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1f1a0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
1f1b0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1f1c0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
1f1d0 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
1f1e0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1f1f0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1f200 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
1f210 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67  pF;.  struct Agg
1f220 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20  Info_col *pC;.. 
1f230 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
1f240 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 73 71 6c  tMode = 1;.  sql
1f250 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
1f260 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
1f270 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
1f280 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
1f290 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
1f2a0 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e  +, pF++){.    in
1f2b0 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  t nArg;.    int 
1f2c0 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20  addrNext = 0;.  
1f2d0 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20    int regAgg;.  
1f2e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1f2f0 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
1f300 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
1f310 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1f320 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
1f330 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1f340 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
1f350 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70  {.      nArg = p
1f360 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
1f370 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69     regAgg = sqli
1f380 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
1f390 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20  pParse, nArg);. 
1f3a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f3b0 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
1f3c0 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41  rse, pList, regA
1f3d0 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73  gg, 1);.    }els
1f3e0 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  e{.      nArg = 
1f3f0 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  0;.      regAgg 
1f400 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
1f410 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  f( pF->iDistinct
1f420 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  >=0 ){.      add
1f430 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
1f440 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1f450 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
1f460 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Arg==1 );.      
1f470 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
1f480 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  rse, pF->iDistin
1f490 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c  ct, addrNext, 1,
1f4a0 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a   regAgg);.    }.
1f4b0 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
1f4c0 63 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  c->flags & SQLIT
1f4d0 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
1f4e0 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
1f4f0 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20   *pColl = 0;.   
1f500 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1f510 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1f520 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
1f530 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
1f540 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74  !=0 );  /* pList
1f550 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63  !=0 if pF->pFunc
1f560 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f   has NEEDCOLL */
1f570 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
1f580 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
1f590 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67  !pColl && j<nArg
1f5a0 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
1f5b0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
1f5c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
1f5d0 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
1f5e0 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
1f5f0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43   }.      if( !pC
1f600 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
1f610 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
1f620 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
1f630 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1f640 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1f650 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
1f660 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
1f670 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
1f680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1f690 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1f6a0 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20   OP_AggStep, 0, 
1f6b0 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d  regAgg, pF->iMem
1f6c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f6d0 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
1f6e0 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
1f6f0 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74  CDEF);.    sqlit
1f700 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1f710 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20  , (u8)nArg);.   
1f720 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1f730 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
1f740 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
1f750 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
1f760 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
1f770 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
1f780 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66  g, nArg);.    if
1f790 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20  ( addrNext ){.  
1f7a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1f7b0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
1f7c0 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  ddrNext);.      
1f7d0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1f7e0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
1f7f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42     }.  }..  /* B
1f800 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67  efore populating
1f810 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
1f820 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61   registers, clea
1f830 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  r the column cac
1f840 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  he..  ** Otherwi
1f850 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68  se, if any of th
1f860 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d  e required colum
1f870 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72  n values are alr
1f880 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20  eady present .  
1f890 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c  ** in registers,
1f8a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1f8b0 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43  () may use OP_SC
1f8c0 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20  opy to copy the 
1f8d0 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43  value.  ** to pC
1f8e0 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74  ->iMem. But by t
1f8f0 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75  he time the valu
1f900 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f  e is used, the o
1f910 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72  riginal register
1f920 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62  .  ** may have b
1f930 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69  een used, invali
1f940 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72  dating the under
1f950 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c  lying buffer hol
1f960 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65  ding the.  ** te
1f970 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65  xt or blob value
1f980 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38  . See ticket [88
1f990 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a  3034dcb5]..  **.
1f9a0 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c    ** Another sol
1f9b0 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74  ution would be t
1f9c0 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  o change the OP_
1f9d0 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f  SCopy used to co
1f9e0 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76  py cached.  ** v
1f9f0 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43  alues to an OP_C
1fa00 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  opy..  */.  sqli
1fa10 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
1fa20 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
1fa30 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66  (i=0, pC=pAggInf
1fa40 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49  o->aCol; i<pAggI
1fa50 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
1fa60 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20  r; i++, pC++){. 
1fa70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1fa80 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70  de(pParse, pC->p
1fa90 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b  Expr, pC->iMem);
1faa0 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d  .  }.  pAggInfo-
1fab0 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b  >directMode = 0;
1fac0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
1fad0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
1fae0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1faf0 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61   single OP_Expla
1fb00 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  in instruction t
1fb10 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20 65 78  o the VDBE to ex
1fb20 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a  plain a simple.*
1fb30 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79  * count(*) query
1fb40 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   ("SELECT count(
1fb50 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a  *) FROM pTab")..
1fb60 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1fb70 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73  E_OMIT_EXPLAIN.s
1fb80 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
1fb90 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20  inSimpleCount(. 
1fba0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbc0 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
1fbd0 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
1fbe0 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
1fbf0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1fc00 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f  being queried */
1fc10 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc30 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64     /* Index used
1fc40 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61   to optimize sca
1fc50 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  n, or NULL */.){
1fc60 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
1fc70 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
1fc80 20 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71   char *zEqp = sq
1fc90 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
1fca0 72 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54  rse->db, "SCAN T
1fcb0 41 42 4c 45 20 25 73 20 25 73 25 73 28 7e 25 64  ABLE %s %s%s(~%d
1fcc0 20 72 6f 77 73 29 22 2c 0a 20 20 20 20 20 20 20   rows)",.       
1fcd0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20   pTab->zName, . 
1fce0 20 20 20 20 20 20 20 70 49 64 78 20 3f 20 22 55         pIdx ? "U
1fcf0 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e  SING COVERING IN
1fd00 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20  DEX " : "",.    
1fd10 20 20 20 20 70 49 64 78 20 3f 20 70 49 64 78 2d      pIdx ? pIdx-
1fd20 3e 7a 4e 61 6d 65 20 3a 20 22 22 2c 0a 20 20 20  >zName : "",.   
1fd30 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45       pTab->nRowE
1fd40 73 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  st.    );.    sq
1fd50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1fd60 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
1fd70 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61  >pVdbe, OP_Expla
1fd80 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
1fd90 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71  ectId, 0, 0, zEq
1fda0 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20  p, P4_DYNAMIC.  
1fdb0 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65    );.  }.}.#else
1fdc0 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
1fdd0 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62  nSimpleCount(a,b
1fde0 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,c).#endif../*.*
1fdf0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1fe00 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20 73  for the SELECT s
1fe10 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69  tatement given i
1fe20 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74  n the p argument
1fe30 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  .  .**.** The re
1fe40 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69  sults are distri
1fe50 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73  buted in various
1fe60 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20   ways depending 
1fe70 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  on the.** conten
1fe80 74 73 20 6f 66 20 74 68 65 20 53 65 6c 65 63 74  ts of the Select
1fe90 44 65 73 74 20 73 74 72 75 63 74 75 72 65 20 70  Dest structure p
1fea0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 61 72 67  ointed to by arg
1feb0 75 6d 65 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61  ument pDest.** a
1fec0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
1fed0 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
1fee0 74 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20  t    Result.**  
1fef0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20     ------------ 
1ff00 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
1ff10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ff20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
1ff30 2a 20 20 20 20 20 53 52 54 5f 4f 75 74 70 75 74  *     SRT_Output
1ff40 20 20 20 20 20 20 47 65 6e 65 72 61 74 65 20 61        Generate a
1ff50 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 28   row of output (
1ff60 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 73  using the OP_Res
1ff70 75 6c 74 52 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ultRow.**       
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
1ff90 63 6f 64 65 29 20 66 6f 72 20 65 61 63 68 20 72  code) for each r
1ffa0 6f 77 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ow in the result
1ffb0 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20   set..**.**     
1ffc0 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20  SRT_Mem         
1ffd0 4f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 74 68  Only valid if th
1ffe0 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 73 69  e result is a si
1fff0 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20  ngle column..** 
20000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20010 20 20 20 20 53 74 6f 72 65 20 74 68 65 20 66 69      Store the fi
20020 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  rst column of th
20030 65 20 66 69 72 73 74 20 72 65 73 75 6c 74 20 72  e first result r
20040 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
20050 20 20 20 20 20 20 20 20 20 20 69 6e 20 72 65 67            in reg
20060 69 73 74 65 72 20 70 44 65 73 74 2d 3e 69 50 61  ister pDest->iPa
20070 72 6d 20 74 68 65 6e 20 61 62 61 6e 64 6f 6e 20  rm then abandon 
20080 74 68 65 20 72 65 73 74 0a 2a 2a 20 20 20 20 20  the rest.**     
20090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200a0 6f 66 20 74 68 65 20 71 75 65 72 79 2e 20 20 54  of the query.  T
200b0 68 69 73 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  his destination 
200c0 69 6d 70 6c 69 65 73 20 22 4c 49 4d 49 54 20 31  implies "LIMIT 1
200d0 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  "..**.**     SRT
200e0 5f 53 65 74 20 20 20 20 20 20 20 20 20 54 68 65  _Set         The
200f0 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20   result must be 
20100 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e  a single column.
20110 20 20 53 74 6f 72 65 20 65 61 63 68 0a 2a 2a 20    Store each.** 
20120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20130 20 20 20 20 72 6f 77 20 6f 66 20 72 65 73 75 6c      row of resul
20140 74 20 61 73 20 74 68 65 20 6b 65 79 20 69 6e 20  t as the key in 
20150 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61  table pDest->iPa
20160 72 6d 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  rm. .**         
20170 20 20 20 20 20 20 20 20 20 20 20 20 41 70 70 6c              Appl
20180 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 70  y the affinity p
20190 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 20 62  Dest->affinity b
201a0 65 66 6f 72 65 20 73 74 6f 72 69 6e 67 0a 2a 2a  efore storing.**
201b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201c0 20 20 20 20 20 72 65 73 75 6c 74 73 2e 20 20 55       results.  U
201d0 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
201e0 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e   "IN (SELECT ...
201f0 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  )"..**.**     SR
20200 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74  T_Union       St
20210 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 61  ore results as a
20220 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72   key in a tempor
20230 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d  ary table pDest-
20240 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20  >iParm..**.**   
20250 20 20 53 52 54 5f 45 78 63 65 70 74 20 20 20 20    SRT_Except    
20260 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73    Remove results
20270 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72   from the tempor
20280 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d  ary table pDest-
20290 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20  >iParm..**.**   
202a0 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20    SRT_Table     
202b0 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
202c0 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  in temporary tab
202d0 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e  le pDest->iParm.
202e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
202f0 20 20 20 20 20 20 20 20 54 68 69 73 20 69 73 20          This is 
20300 6c 69 6b 65 20 53 52 54 5f 45 70 68 65 6d 54 61  like SRT_EphemTa
20310 62 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  b except that th
20320 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  e table.**      
20330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
20340 73 20 61 73 73 75 6d 65 64 20 74 6f 20 61 6c 72  s assumed to alr
20350 65 61 64 79 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  eady be open..**
20360 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 70 68 65  .**     SRT_Ephe
20370 6d 54 61 62 20 20 20 20 43 72 65 61 74 65 20 61  mTab    Create a
20380 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
20390 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 61  e pDest->iParm a
203a0 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 20 20 20 20  nd store.**     
203b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203c0 74 68 65 20 72 65 73 75 6c 74 20 74 68 65 72 65  the result there
203d0 2e 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20  . The cursor is 
203e0 6c 65 66 74 20 6f 70 65 6e 20 61 66 74 65 72 0a  left open after.
203f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
20400 20 20 20 20 20 20 20 72 65 74 75 72 6e 69 6e 67         returning
20410 2e 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20  .  This is like 
20420 53 52 54 5f 54 61 62 6c 65 20 65 78 63 65 70 74  SRT_Table except
20430 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
20440 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
20450 73 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 75 73  s destination us
20460 65 73 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  es OP_OpenEpheme
20470 72 61 6c 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a  ral to create.**
20480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20490 20 20 20 20 20 74 68 65 20 74 61 62 6c 65 20 66       the table f
204a0 69 72 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  irst..**.**     
204b0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20  SRT_Coroutine   
204c0 47 65 6e 65 72 61 74 65 20 61 20 63 6f 2d 72 6f  Generate a co-ro
204d0 75 74 69 6e 65 20 74 68 61 74 20 72 65 74 75 72  utine that retur
204e0 6e 73 20 61 20 6e 65 77 20 72 6f 77 20 6f 66 0a  ns a new row of.
204f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
20500 20 20 20 20 20 20 20 72 65 73 75 6c 74 73 20 65         results e
20510 61 63 68 20 74 69 6d 65 20 69 74 20 69 73 20 69  ach time it is i
20520 6e 76 6f 6b 65 64 2e 20 20 54 68 65 20 65 6e 74  nvoked.  The ent
20530 72 79 20 70 6f 69 6e 74 0a 2a 2a 20 20 20 20 20  ry point.**     
20540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20550 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  of the co-routin
20560 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72  e is stored in r
20570 65 67 69 73 74 65 72 20 70 44 65 73 74 2d 3e 69  egister pDest->i
20580 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
20590 53 52 54 5f 45 78 69 73 74 73 20 20 20 20 20 20  SRT_Exists      
205a0 53 74 6f 72 65 20 61 20 31 20 69 6e 20 6d 65 6d  Store a 1 in mem
205b0 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e  ory cell pDest->
205c0 69 50 61 72 6d 20 69 66 20 74 68 65 20 72 65 73  iParm if the res
205d0 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
205e0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 69             set i
205f0 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a  s not empty..**.
20600 2a 2a 20 20 20 20 20 53 52 54 5f 44 69 73 63 61  **     SRT_Disca
20610 72 64 20 20 20 20 20 54 68 72 6f 77 20 74 68 65  rd     Throw the
20620 20 72 65 73 75 6c 74 73 20 61 77 61 79 2e 20 20   results away.  
20630 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
20640 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  SELECT.**       
20650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
20660 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69 6e 20  atements within 
20670 74 72 69 67 67 65 72 73 20 77 68 6f 73 65 20 6f  triggers whose o
20680 6e 6c 79 20 70 75 72 70 6f 73 65 20 69 73 0a 2a  nly purpose is.*
20690 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
206a0 20 20 20 20 20 20 74 68 65 20 73 69 64 65 2d 65        the side-e
206b0 66 66 65 63 74 73 20 6f 66 20 66 75 6e 63 74 69  ffects of functi
206c0 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
206d0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
206e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
206f0 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
20700 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
20710 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
20720 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
20730 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
20740 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
20750 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
20760 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
20770 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
20780 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
20790 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
207a0 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
207b0 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
207c0 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  that..*/.int sql
207d0 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61  ite3Select(.  Pa
207e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
207f0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
20800 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
20810 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
20820 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
20830 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
20840 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
20850 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
20860 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20  st      /* What 
20870 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71  to do with the q
20880 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
20890 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
208a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
208b0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
208c0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
208d0 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75  nfo;     /* Retu
208e0 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57  rn from sqlite3W
208f0 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20  hereBegin() */. 
20900 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
20910 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
20920 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75  irtual machine u
20930 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
20940 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  n */.  int isAgg
20950 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
20960 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
20970 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
20980 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
20990 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
209a0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
209b0 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
209c0 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  . */.  SrcList *
209d0 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a  pTabList;     /*
209e0 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
209f0 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
20a00 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
20a10 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
20a20 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
20a30 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
20a40 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
20a50 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  erBy;    /* The 
20a60 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
20a70 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
20a80 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
20a90 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  oupBy;    /* The
20aa0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
20ab0 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
20ac0 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
20ad0 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g;         /* Th
20ae0 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
20af0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
20b00 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63  .  int isDistinc
20b10 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
20b20 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
20b30 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
20b40 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69  sent */.  int di
20b50 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
20b60 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65   /* Table to use
20b70 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
20b80 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72  t set */.  int r
20b90 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
20ba0 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
20bb0 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
20bc0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  unction */.  int
20bd0 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20   addrSortIndex; 
20be0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
20bf0 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65  f an OP_OpenEphe
20c00 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
20c10 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 44  n */.  int addrD
20c20 69 73 74 69 6e 63 74 49 6e 64 65 78 3b 20 2f 2a  istinctIndex; /*
20c30 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f   Address of an O
20c40 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
20c50 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  instruction */. 
20c60 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66   AggInfo sAggInf
20c70 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72  o;      /* Infor
20c80 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61  mation used by a
20c90 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
20ca0 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20   */.  int iEnd; 
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20cc0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65  Address of the e
20cd0 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  nd of the query 
20ce0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
20cf0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
20d00 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
20d10 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64  ection */..#ifnd
20d20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
20d30 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65  XPLAIN.  int iRe
20d40 73 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20  storeSelectId = 
20d50 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
20d60 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65  d;.  pParse->iSe
20d70 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d  lectId = pParse-
20d80 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b  >iNextSelectId++
20d90 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d  ;.#endif..  db =
20da0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
20db0 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  f( p==0 || db->m
20dc0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
20dd0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
20de0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
20df0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
20e00 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
20e10 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
20e20 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
20e30 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41   1;.  memset(&sA
20e40 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  ggInfo, 0, sizeo
20e50 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20  f(sAggInfo));.. 
20e60 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
20e70 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
20e80 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74      assert(pDest
20e90 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69  ->eDest==SRT_Exi
20ea0 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  sts || pDest->eD
20eb0 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c  est==SRT_Union |
20ec0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  | .           pD
20ed0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
20ee0 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d  Except || pDest-
20ef0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63  >eDest==SRT_Disc
20f00 61 72 64 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ard);.    /* If 
20f10 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e  ORDER BY makes n
20f20 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  o difference in 
20f30 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20  the output then 
20f40 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20  neither does.   
20f50 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20   ** DISTINCT so 
20f60 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  it can be remove
20f70 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71  d too. */.    sq
20f80 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
20f90 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
20fa0 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rBy);.    p->pOr
20fb0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
20fc0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
20fd0 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  F_Distinct;.  }.
20fe0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
20ff0 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30  rep(pParse, p, 0
21000 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
21010 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70  p->pOrderBy;.  p
21020 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
21030 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
21040 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
21050 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
21060 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
21070 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
21080 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 73  ct_end;.  }.  is
21090 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  Agg = (p->selFla
210a0 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
210b0 65 29 21 3d 30 3b 0a 20 20 61 73 73 65 72 74 28  e)!=0;.  assert(
210c0 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20   pEList!=0 );.. 
210d0 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
210e0 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  ting code..  */.
210f0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
21100 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
21110 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
21120 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
21130 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20  * If writing to 
21140 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61  memory or genera
21150 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20  ting a set.  ** 
21160 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f  only a single co
21170 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70  lumn may be outp
21180 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ut..  */.#ifndef
21190 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
211a0 51 55 45 52 59 0a 20 20 69 66 28 20 63 68 65 63  QUERY.  if( chec
211b0 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
211c0 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
211d0 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74  e, pDest, pEList
211e0 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
211f0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
21200 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
21210 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
21220 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
21230 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
21240 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20  clause.  */.#if 
21250 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
21260 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
21270 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
21280 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66  E_OMIT_VIEW).  f
21290 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69  or(i=0; !p->pPri
212a0 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74  or && i<pTabList
212b0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
212c0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
212d0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
212e0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a  pTabList->a[i];.
212f0 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
21300 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  est;.    Select 
21310 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pSub = pItem->p
21320 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20  Select;.    int 
21330 69 73 41 67 67 53 75 62 3b 0a 0a 20 20 20 20 69  isAggSub;..    i
21340 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e  f( pSub==0 ) con
21350 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
21360 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
21370 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b ){.      sqlit
21380 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21390 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d  OP_Gosub, pItem-
213a0 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74 65  >regReturn, pIte
213b0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b  m->addrFillSub);
213c0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
213d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
213e0 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e  ncrement Parse.n
213f0 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65  Height by the he
21400 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67  ight of the larg
21410 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  est expression. 
21420 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72     ** tree refer
21430 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74  ed to by this, t
21440 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74  he parent select
21450 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65  . The child sele
21460 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f  ct.    ** may co
21470 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  ntain expression
21480 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73   trees of at mos
21490 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45  t.    ** (SQLITE
214a0 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d  _MAX_EXPR_DEPTH-
214b0 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68  Parse.nHeight) h
214c0 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20 61  eight. This is a
214d0 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65   bit.    ** more
214e0 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68   conservative th
214f0 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75  an necessary, bu
21500 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 68  t much easier th
21510 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20  an enforcing.   
21520 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d   ** an exact lim
21530 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  it..    */.    p
21540 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b  Parse->nHeight +
21550 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
21560 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20  xprHeight(p);.. 
21570 20 20 20 69 73 41 67 67 53 75 62 20 3d 20 28 70     isAggSub = (p
21580 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
21590 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30  SF_Aggregate)!=0
215a0 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65  ;.    if( flatte
215b0 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65  nSubquery(pParse
215c0 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69  , p, i, isAgg, i
215d0 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20  sAggSub) ){.    
215e0 20 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65    /* This subque
215f0 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62  ry can be absorb
21600 65 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65  ed into its pare
21610 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  nt. */.      if(
21620 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20   isAggSub ){.   
21630 20 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a       isAgg = 1;.
21640 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c          p->selFl
21650 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67  ags |= SF_Aggreg
21660 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ate;.      }.   
21670 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d     i = -1;.    }
21680 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47  else{.      /* G
21690 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
216a0 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 66  tine that will f
216b0 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ill an ephemeral
216c0 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20   table with.    
216d0 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74    ** the content
216e0 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65 72   of this subquer
216f0 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  y.  pItem->addrF
21700 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e  illSub will poin
21710 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  t.      ** to th
21720 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
21730 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72 6f   generated subro
21740 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72  utine.  pItem->r
21750 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20 2a  egReturn.      *
21760 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20  * is a register 
21770 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c  allocated to hol
21780 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  d the subroutine
21790 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 0a   return address.
217a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
217b0 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20  nt topAddr;.    
217c0 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d    int onceAddr =
217d0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65   0;.      int re
217e0 74 41 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73  tAddr;.      ass
217f0 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72  ert( pItem->addr
21800 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20  FillSub==0 );.  
21810 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
21820 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
21830 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70  >nMem;.      top
21840 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
21850 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
21860 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d  nteger, 0, pItem
21870 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
21880 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46      pItem->addrF
21890 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72  illSub = topAddr
218a0 2b 31 3b 0a 20 20 20 20 20 20 56 64 62 65 4e 6f  +1;.      VdbeNo
218b0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d  opComment((v, "m
218c0 61 74 65 72 69 61 6c 69 7a 65 20 25 73 22 2c 20  aterialize %s", 
218d0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
218e0 6d 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  me));.      if( 
218f0 70 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61  pItem->isCorrela
21900 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ted==0 ){.      
21910 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71    /* If the subq
21920 75 65 72 79 20 69 73 20 6e 6f 20 63 6f 72 72 65  uery is no corre
21930 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20  lated and if we 
21940 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f  are not inside o
21950 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74  f.        ** a t
21960 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20  rigger, then we 
21970 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d  only need to com
21980 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  pute the value o
21990 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20  f the subquery. 
219a0 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20         ** once. 
219b0 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41  */.        onceA
219c0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ddr = sqlite3Cod
219d0 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20  eOnce(pParse);. 
219e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
219f0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
21a00 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70  it(&dest, SRT_Ep
21a10 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69  hemTab, pItem->i
21a20 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 65  Cursor);.      e
21a30 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
21a40 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  (pItem->iSelectI
21a50 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69  d, (u8)pParse->i
21a60 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
21a70 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
21a80 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
21a90 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
21aa0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  Item->pTab->nRow
21ab0 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 29  Est = (unsigned)
21ac0 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
21ad0 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65  ;.      if( once
21ae0 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56 64  Addr ) sqlite3Vd
21af0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e  beJumpHere(v, on
21b00 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72  ceAddr);.      r
21b10 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  etAddr = sqlite3
21b20 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
21b30 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e  _Return, pItem->
21b40 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
21b50 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
21b60 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65  , "end %s", pIte
21b70 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
21b80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21b90 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74  dbeChangeP1(v, t
21ba0 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64 72 29  opAddr, retAddr)
21bb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
21bc0 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
21bd0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
21be0 20 20 20 20 69 66 28 20 2f 2a 70 50 61 72 73 65      if( /*pParse
21bf0 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e  ->nErr ||*/ db->
21c00 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
21c10 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
21c20 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
21c30 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
21c40 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   -= sqlite3Selec
21c50 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
21c60 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
21c70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20  ->pSrc;.    if( 
21c80 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62  !IgnorableOrderb
21c90 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
21ca0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
21cb0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a  pOrderBy;.    }.
21cc0 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70    }.  pEList = p
21cd0 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66  ->pEList;.#endif
21ce0 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
21cf0 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42  Where;.  pGroupB
21d00 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
21d10 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
21d20 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73  pHaving;.  isDis
21d30 74 69 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46  tinct = (p->selF
21d40 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
21d50 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66  ct)!=0;..#ifndef
21d60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
21d70 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f  POUND_SELECT.  /
21d80 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72  * If there is ar
21d90 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  e a sequence of 
21da0 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20  queries, do the 
21db0 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72  earlier ones fir
21dc0 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
21dd0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
21de0 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  if( p->pRightmos
21df0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65  t==0 ){.      Se
21e00 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52  lect *pLoop, *pR
21e10 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ight = 0;.      
21e20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
21e30 20 20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b     int mxSelect;
21e40 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  .      for(pLoop
21e50 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =p; pLoop; pLoop
21e60 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20  =pLoop->pPrior, 
21e70 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  cnt++){.        
21e80 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73  pLoop->pRightmos
21e90 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70  t = p;.        p
21ea0 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52  Loop->pNext = pR
21eb0 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52  ight;.        pR
21ec0 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20  ight = pLoop;.  
21ed0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65      }.      mxSe
21ee0 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69  lect = db->aLimi
21ef0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
21f00 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b  OMPOUND_SELECT];
21f10 0a 20 20 20 20 20 20 69 66 28 20 6d 78 53 65 6c  .      if( mxSel
21f20 65 63 74 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c  ect && cnt>mxSel
21f30 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
21f40 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
21f50 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
21f60 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75   terms in compou
21f70 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20  nd SELECT");.   
21f80 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
21f90 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
21fa0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c    }.    rc = mul
21fb0 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
21fc0 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20   p, pDest);.    
21fd0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
21fe0 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
21ff0 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
22000 65 63 74 49 64 29 3b 0a 20 20 20 20 72 65 74 75  ectId);.    retu
22010 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
22020 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  f..  /* If there
22030 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50   is both a GROUP
22040 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52   BY and an ORDER
22050 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74   BY clause and t
22060 68 65 79 20 61 72 65 0a 20 20 2a 2a 20 69 64 65  hey are.  ** ide
22070 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 64 69 73  ntical, then dis
22080 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42  able the ORDER B
22090 59 20 63 6c 61 75 73 65 20 73 69 6e 63 65 20 74  Y clause since t
220a0 68 65 20 47 52 4f 55 50 20 42 59 0a 20 20 2a 2a  he GROUP BY.  **
220b0 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d   will cause elem
220c0 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74  ents to come out
220d0 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
220e0 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69 73 0a  order.  This is.
220f0 20 20 2a 2a 20 61 6e 20 6f 70 74 69 6d 69 7a 61    ** an optimiza
22100 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65  tion - the corre
22110 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64  ct answer should
22120 20 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65   result regardle
22130 73 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65  ss..  ** Use the
22140 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
22150 72 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53  rder flag with S
22160 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
22170 50 54 49 4d 49 5a 45 52 0a 20 20 2a 2a 20 74 6f  PTIMIZER.  ** to
22180 20 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70   disable this op
22190 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
221a0 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  esting purposes.
221b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
221c0 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
221d0 72 65 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  re(p->pGroupBy, 
221e0 70 4f 72 64 65 72 42 79 29 3d 3d 30 0a 20 20 20  pOrderBy)==0.   
221f0 20 20 20 20 20 20 26 26 20 28 64 62 2d 3e 66 6c        && (db->fl
22200 61 67 73 20 26 20 53 51 4c 49 54 45 5f 47 72 6f  ags & SQLITE_Gro
22210 75 70 42 79 4f 72 64 65 72 29 3d 3d 30 20 29 7b  upByOrder)==0 ){
22220 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20  .    pOrderBy = 
22230 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
22240 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53  the query is DIS
22250 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52  TINCT with an OR
22260 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f  DER BY but is no
22270 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20  t an aggregate, 
22280 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  and .  ** if the
22290 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20   select-list is 
222a0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
222b0 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74  ORDER BY list, t
222c0 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20  hen this query. 
222d0 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69   ** can be rewri
222e0 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20  tten as a GROUP 
222f0 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  BY. In other wor
22300 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ds, this:.  **. 
22310 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44   **     SELECT D
22320 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d  ISTINCT xyz FROM
22330 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79   ... ORDER BY xy
22340 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74  z.  **.  ** is t
22350 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20  ransformed to:. 
22360 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
22370 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  ECT xyz FROM ...
22380 20 47 52 4f 55 50 20 42 59 20 78 79 7a 0a 20 20   GROUP BY xyz.  
22390 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  **.  ** The seco
223a0 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65  nd form is prefe
223b0 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65  rred as a single
223c0 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d   index (or temp-
223d0 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20  table) may be . 
223e0 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74   ** used for bot
223f0 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61  h the ORDER BY a
22400 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63  nd DISTINCT proc
22410 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69  essing. As origi
22420 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74  nally .  ** writ
22430 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75  ten the query mu
22440 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61  st use a temp-ta
22450 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74  ble for at least
22460 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45   one of the ORDE
22470 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44  R .  ** BY and D
22480 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20  ISTINCT, and an 
22490 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61 74  index or separat
224a0 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72  e temp-table for
224b0 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f   the other..  */
224c0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
224d0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
224e0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
224f0 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a  )==SF_Distinct .
22500 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
22510 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 4f 72  rListCompare(pOr
22520 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73 74  derBy, p->pEList
22530 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d  )==0.  ){.    p-
22540 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
22550 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70  _Distinct;.    p
22560 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
22570 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
22580 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30  db, p->pEList, 0
22590 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20  );.    pGroupBy 
225a0 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
225b0 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
225c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
225d0 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
225e0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
225f0 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a  this sorting.  *
22600 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e  * index might en
22610 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65  d up being unuse
22620 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61  d if the data ca
22630 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61  n be .  ** extra
22640 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74  cted in pre-sort
22650 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68  ed order.  If th
22660 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
22670 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50  then the.  ** OP
22680 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
22690 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20  nstruction will 
226a0 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e  be changed to an
226b0 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20   OP_Noop once.  
226c0 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74  ** we figure out
226d0 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e   that the sortin
226e0 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e  g index is not n
226f0 65 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72  eeded.  The addr
22700 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76  SortIndex.  ** v
22710 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
22720 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68  to facilitate th
22730 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  at change..  */.
22740 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
22750 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
22760 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65  KeyInfo;.    pKe
22770 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
22780 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
22790 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20  se, pOrderBy);. 
227a0 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43     pOrderBy->iEC
227b0 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
227c0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61  nTab++;.    p->a
227d0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
227e0 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d   addrSortIndex =
227f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
22800 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
22810 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
22820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22830 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42           pOrderB
22840 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72  y->iECursor, pOr
22850 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20  derBy->nExpr+2, 
22860 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
22870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
22880 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
22890 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
228a0 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  F);.  }else{.   
228b0 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d   addrSortIndex =
228c0 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
228d0 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
228e0 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
228f0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
22900 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
22910 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
22920 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
22930 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71  hemTab ){.    sq
22940 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
22950 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
22960 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 50 61 72  ral, pDest->iPar
22970 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  m, pEList->nExpr
22980 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
22990 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20   the limiter..  
229a0 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69  */.  iEnd = sqli
229b0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
229c0 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63  (v);.  p->nSelec
229d0 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 4c  tRow = (double)L
229e0 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20  ARGEST_INT64;.  
229f0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
22a00 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
22a10 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d   iEnd);.  if( p-
22a20 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 61 64  >iLimit==0 && ad
22a30 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29  drSortIndex>=0 )
22a40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
22a50 65 47 65 74 4f 70 28 76 2c 20 61 64 64 72 53 6f  eGetOp(v, addrSo
22a60 72 74 49 6e 64 65 78 29 2d 3e 6f 70 63 6f 64 65  rtIndex)->opcode
22a70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e   = OP_SorterOpen
22a80 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
22a90 73 20 7c 3d 20 53 46 5f 55 73 65 53 6f 72 74 65  s |= SF_UseSorte
22aa0 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  r;.  }..  /* Ope
22ab0 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  n a virtual inde
22ac0 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
22ad0 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
22ae0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
22af0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
22b00 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  nct ){.    KeyIn
22b10 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
22b20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61    distinct = pPa
22b30 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
22b40 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
22b50 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
22b60 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
22b70 74 29 3b 0a 20 20 20 20 61 64 64 72 44 69 73 74  t);.    addrDist
22b80 69 6e 63 74 49 6e 64 65 78 20 3d 20 73 71 6c 69  inctIndex = sqli
22b90 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
22ba0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
22bb0 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 2c 20  l, distinct, 0, 
22bc0 30 2c 0a 20 20 20 20 20 20 20 20 28 63 68 61 72  0,.        (char
22bd0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
22be0 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
22bf0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
22c00 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45  ChangeP5(v, BTRE
22c10 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20  E_UNORDERED);.  
22c20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69  }else{.    disti
22c30 6e 63 74 20 3d 20 61 64 64 72 44 69 73 74 69 6e  nct = addrDistin
22c40 63 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20  ctIndex = -1;.  
22c50 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61 74  }..  /* Aggregat
22c60 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67  e and non-aggreg
22c70 61 74 65 20 71 75 65 72 69 65 73 20 61 72 65 20  ate queries are 
22c80 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
22c90 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  tly */.  if( !is
22ca0 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d  Agg && pGroupBy=
22cb0 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  =0 ){.    ExprLi
22cc0 73 74 20 2a 70 44 69 73 74 20 3d 20 28 69 73 44  st *pDist = (isD
22cd0 69 73 74 69 6e 63 74 20 3f 20 70 2d 3e 70 45 4c  istinct ? p->pEL
22ce0 69 73 74 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f  ist : 0);..    /
22cf0 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
22d00 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  base scan. */.  
22d10 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
22d20 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
22d30 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
22d40 57 68 65 72 65 2c 20 26 70 4f 72 64 65 72 42 79  Where, &pOrderBy
22d50 2c 20 70 44 69 73 74 2c 20 30 29 3b 0a 20 20 20  , pDist, 0);.   
22d60 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
22d70 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
22d80 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
22d90 2d 3e 6e 52 6f 77 4f 75 74 20 3c 20 70 2d 3e 6e  ->nRowOut < p->n
22da0 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e  SelectRow ) p->n
22db0 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 57 49 6e  SelectRow = pWIn
22dc0 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20  fo->nRowOut;..  
22dd0 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20    /* If sorting 
22de0 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63  index that was c
22df0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f  reated by a prio
22e00 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  r OP_OpenEphemer
22e10 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72  al .    ** instr
22e20 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20  uction ended up 
22e30 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64  not being needed
22e40 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68  , then change th
22e50 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
22e60 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  al.    ** into a
22e70 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a  n OP_Noop..    *
22e80 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72 53 6f  /.    if( addrSo
22e90 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f  rtIndex>=0 && pO
22ea0 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
22eb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
22ec0 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
22ed0 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
22ee0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
22ef0 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[2] = -1;.   
22f00 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e   }..    if( pWIn
22f10 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29 7b  fo->eDistinct ){
22f20 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70  .      VdbeOp *p
22f30 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Op;             
22f40 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20     /* No longer 
22f50 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68  required OpenEph
22f60 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f  emeral instr. */
22f70 0a 20 20 20 20 20 0a 20 20 20 20 20 20 61 73 73  .     .      ass
22f80 65 72 74 28 20 61 64 64 72 44 69 73 74 69 6e 63  ert( addrDistinc
22f90 74 49 6e 64 65 78 3e 3d 30 20 29 3b 0a 20 20 20  tIndex>=0 );.   
22fa0 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
22fb0 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64 64  VdbeGetOp(v, add
22fc0 72 44 69 73 74 69 6e 63 74 49 6e 64 65 78 29 3b  rDistinctIndex);
22fd0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
22fe0 69 73 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  isDistinct );.  
22ff0 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e      assert( pWIn
23000 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57  fo->eDistinct==W
23010 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
23020 44 45 52 45 44 20 0a 20 20 20 20 20 20 20 20 20  DERED .         
23030 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 65 44 69    || pWInfo->eDi
23040 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49  stinct==WHERE_DI
23050 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 20 0a 20  STINCT_UNIQUE . 
23060 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 64 69       );.      di
23070 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
23080 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65     if( pWInfo->e
23090 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f  Distinct==WHERE_
230a0 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
230b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
230c0 69 4a 75 6d 70 3b 0a 20 20 20 20 20 20 20 20 69  iJump;.        i
230d0 6e 74 20 69 45 78 70 72 3b 0a 20 20 20 20 20 20  nt iExpr;.      
230e0 20 20 69 6e 74 20 69 46 6c 61 67 20 3d 20 2b 2b    int iFlag = ++
230f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
23100 20 20 20 20 20 20 69 6e 74 20 69 42 61 73 65 20        int iBase 
23110 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
23120 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 42  ;.        int iB
23130 61 73 65 32 20 3d 20 69 42 61 73 65 20 2b 20 70  ase2 = iBase + p
23140 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
23150 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
23160 65 6d 20 2b 3d 20 28 70 45 4c 69 73 74 2d 3e 6e  em += (pEList->n
23170 45 78 70 72 2a 32 29 3b 0a 0a 20 20 20 20 20 20  Expr*2);..      
23180 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20    /* Change the 
23190 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
231a0 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74   coded earlier t
231b0 6f 20 61 6e 20 4f 50 5f 49 6e 74 65 67 65 72 2e  o an OP_Integer.
231c0 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
231d0 4f 50 5f 49 6e 74 65 67 65 72 20 69 6e 69 74 69  OP_Integer initi
231e0 61 6c 69 7a 65 73 20 74 68 65 20 22 66 69 72 73  alizes the "firs
231f0 74 20 72 6f 77 22 20 66 6c 61 67 2e 20 20 2a 2f  t row" flag.  */
23200 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
23210 63 6f 64 65 20 3d 20 4f 50 5f 49 6e 74 65 67 65  code = OP_Intege
23220 72 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  r;.        pOp->
23230 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  p1 = 1;.        
23240 70 4f 70 2d 3e 70 32 20 3d 20 69 46 6c 61 67 3b  pOp->p2 = iFlag;
23250 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
23260 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
23270 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  t(pParse, pEList
23280 2c 20 69 42 61 73 65 2c 20 31 29 3b 0a 20 20 20  , iBase, 1);.   
23290 20 20 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c       iJump = sql
232a0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
232b0 64 64 72 28 76 29 20 2b 20 31 20 2b 20 70 45 4c  ddr(v) + 1 + pEL
232c0 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 31 20 2b  ist->nExpr + 1 +
232d0 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
232e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
232f0 20 4f 50 5f 49 66 2c 20 69 46 6c 61 67 2c 20 69   OP_If, iFlag, i
23300 4a 75 6d 70 2d 31 29 3b 0a 20 20 20 20 20 20 20  Jump-1);.       
23310 20 66 6f 72 28 69 45 78 70 72 3d 30 3b 20 69 45   for(iExpr=0; iE
23320 78 70 72 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  xpr<pEList->nExp
23330 72 3b 20 69 45 78 70 72 2b 2b 29 7b 0a 20 20 20  r; iExpr++){.   
23340 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
23350 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
23360 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
23370 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 45 78  e, pEList->a[iEx
23380 70 72 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  pr].pExpr);.    
23390 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
233a0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65  eAddOp3(v, OP_Ne
233b0 2c 20 69 42 61 73 65 2b 69 45 78 70 72 2c 20 69  , iBase+iExpr, i
233c0 4a 75 6d 70 2c 20 69 42 61 73 65 32 2b 69 45 78  Jump, iBase2+iEx
233d0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  pr);.          s
233e0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
233f0 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74  P4(v, -1, (const
23400 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50   char *)pColl, P
23410 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
23420 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23430 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
23440 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
23450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
23460 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
23470 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
23480 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
23490 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c  e);..        sql
234a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
234b0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
234c0 20 69 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 20   iFlag);.       
234d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
234e0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
234f0 76 29 3d 3d 69 4a 75 6d 70 20 29 3b 0a 20 20 20  v)==iJump );.   
23500 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23510 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 6f 76  AddOp3(v, OP_Mov
23520 65 2c 20 69 42 61 73 65 2c 20 69 42 61 73 65 32  e, iBase, iBase2
23530 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
23540 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
23550 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
23560 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
23570 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
23580 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
23590 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e  dard inner loop.
235a0 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e   */.    selectIn
235b0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
235c0 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p, pEList, 0, 0,
235d0 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69   pOrderBy, disti
235e0 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20  nct, pDest,.    
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23600 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
23610 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  e, pWInfo->iBrea
23620 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20  k);..    /* End 
23630 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
23640 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
23650 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
23660 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65  nd(pWInfo);.  }e
23670 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
23680 20 69 73 20 74 68 65 20 70 72 6f 63 65 73 73 69   is the processi
23690 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
236a0 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20 20   queries */.    
236b0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
236c0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
236d0 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ext for processi
236e0 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66  ng aggregate inf
236f0 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
23700 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20  int iAMem;      
23710 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
23720 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f   address for sto
23730 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f  ring current GRO
23740 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
23750 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iBMem;         
23760 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
23770 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f  dress for previo
23780 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  us GROUP BY */. 
23790 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b     int iUseFlag;
237a0 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64         /* Mem ad
237b0 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c  dress holding fl
237c0 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  ag indicating th
237d0 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20  at at least.    
237e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237f0 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f      ** one row o
23800 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74  f the input to t
23810 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61  he aggregator ha
23820 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20  s been.         
23830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
23840 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  * processed */. 
23850 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61     int iAbortFla
23860 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64  g;     /* Mem ad
23870 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73  dress which caus
23880 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69  es query abort i
23890 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20  f positive */.  
238a0 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72    int groupBySor
238b0 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f  t;    /* Rows co
238c0 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69  me from source i
238d0 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
238e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
238f0 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  End;        /* E
23900 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67  nd of processing
23910 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54   for this SELECT
23920 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74   */.    int sort
23930 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50  PTab = 0;   /* P
23940 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20  seudotable used 
23950 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e  to decode sortin
23960 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20  g results */.   
23970 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30   int sortOut = 0
23980 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72  ;    /* Output r
23990 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65  egister from the
239a0 20 73 6f 72 74 65 72 20 2a 2f 0a 0a 20 20 20 20   sorter */..    
239b0 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e  /* Remove any an
239c0 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65  d all aliases be
239d0 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74  tween the result
239e0 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20   set and the.   
239f0 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61   ** GROUP BY cla
23a00 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  use..    */.    
23a10 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
23a20 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20        int k;    
23a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a40 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
23a50 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  ter */.      str
23a60 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
23a70 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f  m *pItem;  /* Fo
23a80 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
23a90 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c  xpression in a l
23aa0 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f  ist */..      fo
23ab0 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r(k=p->pEList->n
23ac0 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70  Expr, pItem=p->p
23ad0 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  EList->a; k>0; k
23ae0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
23af0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c        pItem->iAl
23b00 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
23b10 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72  .      for(k=pGr
23b20 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49  oupBy->nExpr, pI
23b30 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b  tem=pGroupBy->a;
23b40 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d   k>0; k--, pItem
23b50 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
23b60 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  em->iAlias = 0;.
23b70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
23b80 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  ( p->nSelectRow>
23b90 28 64 6f 75 62 6c 65 29 31 30 30 20 29 20 70 2d  (double)100 ) p-
23ba0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 28 64  >nSelectRow = (d
23bb0 6f 75 62 6c 65 29 31 30 30 3b 0a 20 20 20 20 7d  ouble)100;.    }
23bc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  else{.      p->n
23bd0 53 65 6c 65 63 74 52 6f 77 20 3d 20 28 64 6f 75  SelectRow = (dou
23be0 62 6c 65 29 31 3b 0a 20 20 20 20 7d 0a 0a 20 0a  ble)1;.    }.. .
23bf0 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
23c00 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
23c10 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f   when we want to
23c20 20 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79   abort the query
23c30 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20   */.    addrEnd 
23c40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
23c50 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
23c60 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f  /* Convert TK_CO
23c70 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20  LUMN nodes into 
23c80 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e  TK_AGG_COLUMN an
23c90 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69  d make entries i
23ca0 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66  n.    ** sAggInf
23cb0 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47  o for all TK_AGG
23cc0 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20  _FUNCTION nodes 
23cd0 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  in expressions o
23ce0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c  f the.    ** SEL
23cf0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
23d00 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74     */.    memset
23d10 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
23d20 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e  (sNC));.    sNC.
23d30 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
23d40 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
23d50 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
23d60 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d    sNC.pAggInfo =
23d70 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20   &sAggInfo;.    
23d80 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
23d90 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70  gColumn = pGroup
23da0 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e  By ? pGroupBy->n
23db0 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20  Expr+1 : 0;.    
23dc0 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42  sAggInfo.pGroupB
23dd0 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
23de0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
23df0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
23e00 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
23e10 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
23e20 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
23e30 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
23e40 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
23e50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
23e60 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
23e70 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a  &sNC, pHaving);.
23e80 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
23e90 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  fo.nAccumulator 
23ea0 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  = sAggInfo.nColu
23eb0 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  mn;.    for(i=0;
23ec0 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e   i<sAggInfo.nFun
23ed0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  c; i++){.      a
23ee0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
23ef0 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f  roperty(sAggInfo
23f00 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c  .aFunc[i].pExpr,
23f10 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
23f20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
23f30 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
23f40 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f  t(&sNC, sAggInfo
23f50 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d  .aFunc[i].pExpr-
23f60 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
23f70 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
23f80 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
23f90 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
23fa0 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20    /* Processing 
23fb0 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77  for aggregates w
23fc0 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20  ith GROUP BY is 
23fd0 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61  very different a
23fe0 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d  nd.    ** much m
23ff0 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e  ore complex than
24000 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
24010 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a  out a GROUP BY..
24020 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
24030 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
24040 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
24050 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69  fo;  /* Keying i
24060 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
24070 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75  he group by clau
24080 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  se */.      int 
24090 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  j1;             
240a0 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72  /* A-vs-B compar
240b0 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20  ision jump */.  
240c0 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70      int addrOutp
240d0 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74  utRow;  /* Start
240e0 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74   of subroutine t
240f0 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65  hat outputs a re
24100 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  sult row */.    
24110 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52    int regOutputR
24120 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ow;   /* Return 
24130 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
24140 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72   for output subr
24150 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20  outine */.      
24160 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74  int addrSetAbort
24170 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61  ;   /* Set the a
24180 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65  bort flag and re
24190 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  turn */.      in
241a0 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b  t addrTopOfLoop;
241b0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
241c0 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20  input loop */.  
241d0 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74      int addrSort
241e0 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f  ingIdx; /* The O
241f0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
24200 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  for the sorting 
24210 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
24220 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20  nt addrReset;   
24230 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65     /* Subroutine
24240 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74   for resetting t
24250 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a  he accumulator *
24260 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52  /.      int regR
24270 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52  eset;       /* R
24280 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
24290 67 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74  gister for reset
242a0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a   subroutine */..
242b0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
242c0 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20  e is a GROUP BY 
242d0 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20  clause we might 
242e0 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69  need a sorting i
242f0 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ndex to.      **
24300 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20   implement it.  
24310 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f  Allocate that so
24320 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e  rting index now.
24330 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75    If it turns ou
24340 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  t.      ** that 
24350 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69  we do not need i
24360 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65  t after all, the
24370 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69   OP_SorterOpen i
24380 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20  nstruction.     
24390 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76   ** will be conv
243a0 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f  erted into a Noo
243b0 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  p.  .      */.  
243c0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
243d0 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65  tingIdx = pParse
243e0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
243f0 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
24400 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
24410 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29  Parse, pGroupBy)
24420 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74  ;.      addrSort
24430 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33  ingIdx = sqlite3
24440 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
24450 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20  _SorterOpen, .  
24460 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
24470 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67  .sortingIdx, sAg
24480 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
24490 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  lumn, .         
244a0 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49   0, (char*)pKeyI
244b0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
244c0 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20  HANDOFF);..     
244d0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d   /* Initialize m
244e0 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
244f0 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59  used by GROUP BY
24500 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65   aggregate proce
24510 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20  ssing.      */. 
24520 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20       iUseFlag = 
24530 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
24540 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67        iAbortFlag
24550 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
24560 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70  m;.      regOutp
24570 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65  utRow = ++pParse
24580 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64  ->nMem;.      ad
24590 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71  drOutputRow = sq
245a0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
245b0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67  el(v);.      reg
245c0 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  Reset = ++pParse
245d0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64  ->nMem;.      ad
245e0 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65  drReset = sqlite
245f0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
24600 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d  );.      iAMem =
24610 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
24620 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
24630 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
24640 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
24650 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iBMem = pParse->
24660 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
24670 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
24680 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
24690 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
246a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
246b0 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72  nteger, 0, iAbor
246c0 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  tFlag);.      Vd
246d0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63  beComment((v, "c
246e0 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22  lear abort flag"
246f0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
24700 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
24710 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55  P_Integer, 0, iU
24720 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  seFlag);.      V
24730 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
24740 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c  indicate accumul
24750 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20  ator empty"));. 
24760 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24770 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp3(v, OP_Nul
24780 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d  l, 0, iAMem, iAM
24790 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  em+pGroupBy->nEx
247a0 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  pr-1);..      /*
247b0 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68   Begin a loop th
247c0 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
247d0 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20  all source rows 
247e0 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
247f0 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  r..      ** This
24800 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74   might involve t
24810 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70  wo separate loop
24820 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72  s with an OP_Sor
24830 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72  t in between, or
24840 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67  .      ** it mig
24850 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c  ht be a single l
24860 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61 6e  oop that uses an
24870 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63   index to extrac
24880 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20  t information.  
24890 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69      ** in the ri
248a0 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67  ght order to beg
248b0 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a  in with..      *
248c0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
248d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
248e0 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c  Gosub, regReset,
248f0 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
24900 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
24910 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
24920 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
24930 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75 70 42  pWhere, &pGroupB
24940 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  y, 0, 0);.      
24950 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
24960 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
24970 0a 20 20 20 20 20 20 69 66 28 20 70 47 72 6f 75  .      if( pGrou
24980 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBy==0 ){.      
24990 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a    /* The optimiz
249a0 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65  er is able to de
249b0 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72  liver rows in gr
249c0 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a  oup by order so.
249d0 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f          ** we do
249e0 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72   not have to sor
249f0 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45  t.  The OP_OpenE
24a00 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
24a10 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
24a20 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65  * cancelled late
24a30 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69  r because we sti
24a40 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74  ll need to use t
24a50 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20  he pKeyInfo.    
24a60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
24a70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
24a80 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 67  oupBy;.        g
24a90 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a  roupBySort = 0;.
24aa0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24ab0 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65       /* Rows are
24ac0 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75   coming out in u
24ad0 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65  ndetermined orde
24ae0 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70  r.  We have to p
24af0 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  ush.        ** e
24b00 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73  ach row into a s
24b10 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65  orting index, te
24b20 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73  rminate the firs
24b30 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  t loop,.        
24b40 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65  ** then loop ove
24b50 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
24b60 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  dex in order to 
24b70 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20  get the output. 
24b80 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72         ** in sor
24b90 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ted order.      
24ba0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
24bb0 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
24bc0 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
24bd0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
24be0 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  l;.        int n
24bf0 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20  GroupBy;..      
24c00 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
24c10 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  le(pParse, .    
24c20 20 20 20 20 20 20 20 20 69 73 44 69 73 74 69 6e          isDistin
24c30 63 74 20 26 26 20 21 28 70 2d 3e 73 65 6c 46 6c  ct && !(p->selFl
24c40 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29  ags&SF_Distinct)
24c50 3f 22 44 49 53 54 49 4e 43 54 22 3a 22 47 52 4f  ?"DISTINCT":"GRO
24c60 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20  UP BY");..      
24c70 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
24c80 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75  1;.        nGrou
24c90 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  pBy = pGroupBy->
24ca0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e  nExpr;.        n
24cb0 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b  Col = nGroupBy +
24cc0 20 31 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20   1;.        j = 
24cd0 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20  nGroupBy+1;.    
24ce0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
24cf0 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
24d00 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
24d10 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43   if( sAggInfo.aC
24d20 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c  ol[i].iSorterCol
24d30 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
24d40 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20        nCol++;.  
24d50 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
24d60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24d70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
24d80 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
24d90 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
24da0 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
24db0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
24dc0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
24dd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24de0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
24df0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
24e00 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a  y, regBase, 0);.
24e10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
24e20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
24e30 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e  Sequence, sAggIn
24e40 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72 65  fo.sortingIdx,re
24e50 67 42 61 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b  gBase+nGroupBy);
24e60 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
24e70 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20  oupBy+1;.       
24e80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
24e90 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
24ea0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
24eb0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
24ec0 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e   *pCol = &sAggIn
24ed0 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20  fo.aCol[i];.    
24ee0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
24ef0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
24f00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24f10 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67  int r1 = j + reg
24f20 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Base;.          
24f30 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20    int r2;..     
24f40 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
24f50 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
24f60 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20 20  lumn(pParse, .  
24f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
24f90 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69  l->pTab, pCol->i
24fa0 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54  Column, pCol->iT
24fb0 61 62 6c 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  able, r1);.     
24fc0 20 20 20 20 20 20 20 69 66 28 20 72 31 21 3d 72         if( r1!=r
24fd0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
24fe0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
24ff0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
25000 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20 20 20  , r2, r1);.     
25010 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25020 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
25030 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
25040 20 20 20 20 20 20 20 20 72 65 67 52 65 63 6f 72          regRecor
25050 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
25060 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
25070 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
25080 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
25090 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61  akeRecord, regBa
250a0 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63  se, nCol, regRec
250b0 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
250c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
250d0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  v, OP_SorterInse
250e0 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
250f0 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f  tingIdx, regReco
25100 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
25110 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
25120 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
25130 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
25140 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
25150 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
25160 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20  egBase, nCol);. 
25170 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
25180 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
25190 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
251a0 2e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 20  .sortingIdxPTab 
251b0 3d 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50 61  = sortPTab = pPa
251c0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
251d0 20 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20 73       sortOut = s
251e0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
251f0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
25200 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25210 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
25220 65 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20  eudo, sortPTab, 
25230 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a  sortOut, nCol);.
25240 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
25250 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
25260 53 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67 67  SorterSort, sAgg
25270 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
25280 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
25290 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
252a0 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72  v, "GROUP BY sor
252b0 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41  t"));.        sA
252c0 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e  ggInfo.useSortin
252d0 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  gIdx = 1;.      
252e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
252f0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
25300 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
25310 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
25320 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
25330 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65   terms and store
25340 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e   in b0, b1, b2..
25350 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69  ..      ** (b0 i
25360 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
25370 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73  n iBMem+0, b1 is
25380 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f   iBMem+1, and so
25390 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a   forth).      **
253a0 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68   Then compare th
253b0 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
253c0 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74  BY terms against
253d0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
253e0 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  rms.      ** fro
253f0 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  m the previous r
25400 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ow currently sto
25410 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61  red in a0, a1, a
25420 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  2....      */.  
25430 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f      addrTopOfLoo
25440 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
25450 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
25460 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
25470 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
25480 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72  e);.      if( gr
25490 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
254a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
254b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
254c0 74 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66  terData, sAggInf
254d0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 6f  o.sortingIdx, so
254e0 72 74 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a  rtOut);.      }.
254f0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
25500 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
25510 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
25520 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
25530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
25540 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
25550 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72  , OP_Column, sor
25560 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b  tPTab, j, iBMem+
25570 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  j);.          if
25580 28 20 6a 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  ( j==0 ) sqlite3
25590 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
255a0 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48  OPFLAG_CLEARCACH
255b0 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  E);.        }els
255c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  e{.          sAg
255d0 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65  gInfo.directMode
255e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
255f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
25600 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
25610 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42  ->a[j].pExpr, iB
25620 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
25630 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
25640 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25650 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
25660 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70   iAMem, iBMem, p
25670 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a  GroupBy->nExpr,.
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25690 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
256a0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
256b0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31  YINFO);.      j1
256c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
256d0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
256e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
256f0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
25700 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29  , j1+1, 0, j1+1)
25710 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
25720 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72  rate code that r
25730 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  uns whenever the
25740 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65   GROUP BY change
25750 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e  s..      ** Chan
25760 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50  ges in the GROUP
25770 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64   BY are detected
25780 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
25790 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62   code.      ** b
257a0 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20  lock.  If there 
257b0 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c  were no changes,
257c0 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73   this block is s
257d0 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  kipped..      **
257e0 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63  .      ** This c
257f0 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65  ode copies curre
25800 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d  nt group by term
25810 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e  s in b0,b1,b2,..
25820 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20  ..      ** over 
25830 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74  to a0,a1,a2.  It
25840 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20   then calls the 
25850 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
25860 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  e.      ** and r
25870 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67  esets the aggreg
25880 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
25890 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65  registers in pre
258a0 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  paration.      *
258b0 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47  * for the next G
258c0 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20  ROUP BY batch.. 
258d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
258e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
258f0 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c  e(pParse, iBMem,
25900 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iAMem, pGroupBy
25910 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
25920 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25930 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
25940 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
25950 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
25960 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
25970 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72  v, "output one r
25980 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ow"));.      sql
25990 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
259a0 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f  , OP_IfPos, iAbo
259b0 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29  rtFlag, addrEnd)
259c0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
259d0 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61  ent((v, "check a
259e0 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
259f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25a00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
25a10 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
25a20 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56  rReset);.      V
25a30 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
25a40 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f  reset accumulato
25a50 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
25a60 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65  Update the aggre
25a70 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
25a80 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  s based on the c
25a90 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20  ontent of.      
25aa0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ** the current r
25ab0 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ow.      */.    
25ac0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
25ad0 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
25ae0 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
25af0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
25b00 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
25b10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25b20 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
25b30 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   1, iUseFlag);. 
25b40 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
25b50 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64  ((v, "indicate d
25b60 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74  ata in accumulat
25b70 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
25b80 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   End of the loop
25b90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
25ba0 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
25bb0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
25bc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25bd0 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73  OP_SorterNext, s
25be0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
25bf0 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  dx, addrTopOfLoo
25c00 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  p);.      }else{
25c10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25c20 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
25c30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
25c40 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
25c50 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67  p(v, addrSorting
25c60 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Idx);.      }.. 
25c70 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74       /* Output t
25c80 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20  he final row of 
25c90 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a  result.      */.
25ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25cb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
25cc0 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
25cd0 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
25ce0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
25cf0 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
25d00 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a   final row"));..
25d10 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76        /* Jump ov
25d20 65 72 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  er the subroutin
25d30 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  es.      */.    
25d40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25d50 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
25d60 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20  0, addrEnd);..  
25d70 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
25d80 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
25d90 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67  t outputs a sing
25da0 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
25db0 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
25dc0 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74  t.  This subrout
25dd0 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20  ine first looks 
25de0 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e  at the iUseFlag.
25df0 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20    If iUseFlag.  
25e00 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74      ** is less t
25e10 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
25e20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75  zero, the subrou
25e30 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
25e40 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68    If.      ** th
25e50 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c  e processing cal
25e60 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79  ls for the query
25e70 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20   to abort, this 
25e80 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
25e90 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74   ** increments t
25ea0 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65  he iAbortFlag me
25eb0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65  mory location be
25ec0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
25ed0 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
25ee0 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63   to signal the c
25ef0 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a  aller to abort..
25f00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
25f10 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71  ddrSetAbort = sq
25f20 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
25f30 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
25f40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
25f50 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
25f60 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  1, iAbortFlag);.
25f70 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
25f80 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74  t((v, "set abort
25f90 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
25fa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25fb0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
25fc0 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
25fd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25fe0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
25ff0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
26000 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
26010 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
26020 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
26030 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
26040 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
26050 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20  fPos, iUseFlag, 
26060 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29  addrOutputRow+2)
26070 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
26080 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79  ent((v, "Groupby
26090 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
260a0 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29  r entry point"))
260b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
260c0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
260d0 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
260e0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e  tRow);.      fin
260f0 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
26100 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
26110 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
26120 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
26130 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
26140 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
26150 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
26160 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  LL);.      selec
26170 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
26180 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
26190 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
261a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
261b0 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c         distinct,
261c0 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
261d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
261e0 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61  drOutputRow+1, a
261f0 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20  ddrSetAbort);.  
26200 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26210 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
26220 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
26230 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
26240 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72  ment((v, "end gr
26250 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
26260 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  erator"));..    
26270 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
26280 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
26290 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67  will reset the g
262a0 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61  roup-by accumula
262b0 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  tor.      */.   
262c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
262d0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
262e0 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
262f0 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
26300 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
26310 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
26320 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
26330 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
26340 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20  set);.     .    
26350 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75  } /* endif pGrou
26360 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72  pBy.  Begin aggr
26370 65 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69  egate queries wi
26380 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20  thout GROUP BY: 
26390 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20  */.    else {.  
263a0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44      ExprList *pD
263b0 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  el = 0;.#ifndef 
263c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
263d0 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62  ECOUNT.      Tab
263e0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
263f0 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69  if( (pTab = isSi
26400 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41  mpleCount(p, &sA
26410 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20  ggInfo))!=0 ){. 
26420 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53         /* If isS
26430 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74  impleCount() ret
26440 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
26450 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  o a Table struct
26460 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ure, then.      
26470 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61    ** the SQL sta
26480 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65  tement is of the
26490 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a   form:.        *
264a0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  *.        **   S
264b0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
264c0 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20  ROM <tbl>.      
264d0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
264e0 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20  where the Table 
264f0 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
26500 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61  ed represents ta
26510 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20  ble <tbl>..     
26520 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
26530 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
26540 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61  is so common tha
26550 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65  t it is optimize
26560 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65  d specially. The
26570 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43  .        ** OP_C
26580 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  ount instruction
26590 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74   is executed eit
265a0 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65  her on the intke
265b0 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20  y table that.   
265c0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
265d0 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61   the data for ta
265e0 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20  ble <tbl> or on 
265f0 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78  one of its index
26600 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a  es. It.        *
26610 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65  * is better to e
26620 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e  xecute the op on
26630 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e   an index, as in
26640 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74  dexes are almost
26650 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
26660 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73  ys spread across
26670 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e   less pages than
26680 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e   their correspon
26690 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20  ding tables..   
266a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
266b0 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20  const int iDb = 
266c0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
266d0 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
266e0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
266f0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
26700 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65  nt iCsr = pParse
26710 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
26720 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20   Cursor to scan 
26730 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20  b-tree */.      
26740 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
26750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26760 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
26770 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
26780 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
26790 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
267a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
267b0 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e  eyinfo for scann
267c0 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ed index */.    
267d0 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74      Index *pBest
267e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
267f0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74           /* Best
26800 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20   index found so 
26810 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  far */.        i
26820 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d  nt iRoot = pTab-
26830 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  >tnum;          
26840 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
26850 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72   of scanned b-tr
26860 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73  ee */..        s
26870 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
26880 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
26890 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
268a0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
268b0 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
268c0 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
268d0 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20  zName);..       
268e0 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74   /* Search for t
268f0 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61  he index that ha
26900 73 20 74 68 65 20 6c 65 61 73 74 20 61 6d 6f 75  s the least amou
26910 6e 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 2e 20 49  nt of columns. I
26920 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
26930 72 65 20 69 73 20 73 75 63 68 20 61 6e 20 69 6e  re is such an in
26940 64 65 78 2c 20 61 6e 64 20 69 74 20 68 61 73 20  dex, and it has 
26950 6c 65 73 73 20 63 6f 6c 75 6d 6e 73 20 74 68 61  less columns tha
26960 6e 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  n the table.    
26970 20 20 20 20 2a 2a 20 64 6f 65 73 2c 20 74 68 65      ** does, the
26980 6e 20 77 65 20 63 61 6e 20 61 73 73 75 6d 65 20  n we can assume 
26990 74 68 61 74 20 69 74 20 63 6f 6e 73 75 6d 65 73  that it consumes
269a0 20 6c 65 73 73 20 73 70 61 63 65 20 6f 6e 20 64   less space on d
269b0 69 73 6b 20 61 6e 64 0a 20 20 20 20 20 20 20 20  isk and.        
269c0 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72  ** will therefor
269d0 65 20 62 65 20 63 68 65 61 70 65 72 20 74 6f 20  e be cheaper to 
269e0 73 63 61 6e 20 74 6f 20 64 65 74 65 72 6d 69 6e  scan to determin
269f0 65 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  e the query resu
26a00 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  lt..        ** I
26a10 6e 20 74 68 69 73 20 63 61 73 65 20 73 65 74 20  n this case set 
26a20 69 52 6f 6f 74 20 74 6f 20 74 68 65 20 72 6f 6f  iRoot to the roo
26a30 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
26a40 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65   the index b-tre
26a50 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  e.        ** and
26a60 20 70 4b 65 79 49 6e 66 6f 20 74 6f 20 74 68 65   pKeyInfo to the
26a70 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
26a80 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 6e  re required to n
26a90 61 76 69 67 61 74 65 20 74 68 65 0a 20 20 20 20  avigate the.    
26aa0 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e 0a 20 20      ** index..  
26ab0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
26ac0 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29   ** (2011-04-15)
26ad0 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c   Do not do a ful
26ae0 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f  l scan of an uno
26af0 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20  rdered index..  
26b00 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
26b10 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20   ** In practice 
26b20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
26b30 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62  cture will not b
26b40 65 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e  e used. It is on
26b50 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ly .        ** p
26b60 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50  assed to keep OP
26b70 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e  _OpenRead happy.
26b80 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26b90 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
26ba0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
26bb0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
26bc0 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t){.          if
26bd0 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72  ( pIdx->bUnorder
26be0 65 64 3d 3d 30 20 26 26 20 28 21 70 42 65 73 74  ed==0 && (!pBest
26bf0 20 7c 7c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   || pIdx->nColum
26c00 6e 3c 70 42 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e  n<pBest->nColumn
26c10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
26c20 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20   pBest = pIdx;. 
26c30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26c40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
26c50 20 70 42 65 73 74 20 26 26 20 70 42 65 73 74 2d   pBest && pBest-
26c60 3e 6e 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e  >nColumn<pTab->n
26c70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
26c80 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e   iRoot = pBest->
26c90 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  tnum;.          
26ca0 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
26cb0 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
26cc0 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20  Parse, pBest);. 
26cd0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
26ce0 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64    /* Open a read
26cf0 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78  -only cursor, ex
26d00 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75  ecute the OP_Cou
26d10 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75  nt, close the cu
26d20 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rsor. */.       
26d30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26d40 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
26d50 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20  d, iCsr, iRoot, 
26d60 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66  iDb);.        if
26d70 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
26d80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
26d90 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
26da0 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49  1, (char *)pKeyI
26db0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
26dc0 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
26dd0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
26de0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
26df0 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c   OP_Count, iCsr,
26e00 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
26e10 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  0].iMem);.      
26e20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
26e30 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
26e40 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20   iCsr);.        
26e50 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
26e60 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  nt(pParse, pTab,
26e70 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d   pBest);.      }
26e80 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
26e90 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
26ea0 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b  COUNT */.      {
26eb0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
26ec0 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  k if the query i
26ed0 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s of one of the 
26ee0 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a  following forms:
26ef0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
26f00 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
26f10 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a  min(x) FROM ....
26f20 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
26f30 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20  ECT max(x) FROM 
26f40 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ....        **. 
26f50 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20         ** If it 
26f60 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65  is, then ask the
26f70 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
26f80 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73   to attempt to s
26f90 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20  ort results.    
26fa0 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65      ** as if the
26fb0 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52  re was an "ORDER
26fc0 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52   ON x" or "ORDER
26fd0 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75   ON x DESC" clau
26fe0 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  se. .        ** 
26ff0 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62  If where.c is ab
27000 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65  le to produce re
27010 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20  sults sorted in 
27020 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e  this order, then
27030 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20  .        ** add 
27040 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65  vdbe code to bre
27050 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72  ak out of the pr
27060 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66  ocessing loop af
27070 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 20  ter the .       
27080 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61 74   ** first iterat
27090 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66  ion (since the f
270a0 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
270b0 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20  f the loop is . 
270c0 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e         ** guaran
270d0 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20  teed to operate 
270e0 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20  on the row with 
270f0 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d  the minimum or m
27100 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20  aximum .        
27110 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74  ** value of x, t
27120 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75  he only row requ
27130 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a  ired)..        *
27140 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73  *.        ** A s
27150 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74  pecial flag must
27160 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71   be passed to sq
27170 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
27180 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20  ) to slightly.  
27190 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20        ** modify 
271a0 62 65 68 61 76 69 6f 75 72 20 61 73 20 66 6f 6c  behaviour as fol
271b0 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a  lows:.        **
271c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  .        **   + 
271d0 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
271e0 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
271f0 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70  ", then the loop
27200 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20   coded by.      
27210 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63    **     where.c
27220 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72   should not iter
27230 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c  ate over any val
27240 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  ues with a NULL 
27250 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a  value.        **
27260 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20       for x..    
27270 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
27280 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69  *   + The optimi
27290 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72  zer code in wher
272a0 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20 74  e.c (the thing t
272b0 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69 63  hat decides whic
272c0 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  h.        **    
272d0 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65   index or indice
272e0 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64  s to use) should
272f0 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65   place a differe
27300 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a  nt priority on .
27310 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73          **     s
27320 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f  atisfying the 'O
27330 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20  RDER BY' clause 
27340 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20  than it does in 
27350 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20  other cases..   
27360 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65       **     Refe
27370 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f  r to code and co
27380 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e  mments in where.
27390 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20  c for details.. 
273a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
273b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e    ExprList *pMin
273c0 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Max = 0;.       
273d0 20 75 38 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61   u8 flag = minMa
273e0 78 51 75 65 72 79 28 70 29 3b 0a 20 20 20 20 20  xQuery(p);.     
273f0 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20     if( flag ){. 
27400 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
27410 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
27420 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  y(p->pEList->a[0
27430 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ].pExpr, EP_xIsS
27440 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
27450 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71      pMinMax = sq
27460 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
27470 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  (db, p->pEList->
27480 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c  a[0].pExpr->x.pL
27490 69 73 74 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  ist,0);.        
274a0 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78    pDel = pMinMax
274b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
274c0 70 4d 69 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e  pMinMax && !db->
274d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
274e0 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e              pMin
274f0 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72  Max->a[0].sortOr
27500 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52  der = flag!=WHER
27510 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31  E_ORDERBY_MIN ?1
27520 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0;.            
27530 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45  pMinMax->a[0].pE
27540 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
27550 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  UMN;.          }
27560 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
27570 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
27580 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61  se runs if the a
27590 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20  ggregate has no 
275a0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
275b0 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a    The.        **
275c0 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d   processing is m
275d0 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63  uch simpler sinc
275e0 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  e there is only 
275f0 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20  a single row.   
27600 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75       ** of outpu
27610 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
27620 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
27630 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
27640 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
27650 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
27660 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
27670 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
27680 70 57 68 65 72 65 2c 20 26 70 4d 69 6e 4d 61 78  pWhere, &pMinMax
27690 2c 20 30 2c 20 66 6c 61 67 29 3b 0a 20 20 20 20  , 0, flag);.    
276a0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
276b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
276c0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
276d0 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a  lete(db, pDel);.
276e0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
276f0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
27700 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64     }.        upd
27710 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
27720 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
27730 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
27740 70 4d 69 6e 4d 61 78 20 26 26 20 66 6c 61 67 20  pMinMax && flag 
27750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
27760 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
27770 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57  , OP_Goto, 0, pW
27780 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 20  Info->iBreak);. 
27790 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
277a0 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62  ment((v, "%s() b
277b0 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20  y index",.      
277c0 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d            (flag=
277d0 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
277e0 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29  IN?"min":"max"))
277f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
27800 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
27810 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
27820 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
27830 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
27840 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
27850 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 4f       }..      pO
27860 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
27870 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
27880 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
27890 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53  ving, addrEnd, S
278a0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
278b0 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
278c0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
278d0 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30   p, p->pEList, 0
278e0 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20  , 0, 0, -1, .   
278f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27900 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e     pDest, addrEn
27910 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  d, addrEnd);.   
27920 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
27930 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  stDelete(db, pDe
27940 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
27950 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
27960 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64  Label(v, addrEnd
27970 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65  );.    .  } /* e
27980 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71  ndif aggregate q
27990 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 64  uery */..  if( d
279a0 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
279b0 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
279c0 6c 65 28 70 50 61 72 73 65 2c 20 22 44 49 53 54  le(pParse, "DIST
279d0 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  INCT");.  }..  /
279e0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
279f0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
27a00 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
27a10 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c  o sort the resul
27a20 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64  ts.  ** and send
27a30 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c   them to the cal
27a40 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65  lback one by one
27a50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
27a60 64 65 72 42 79 20 29 7b 0a 20 20 20 20 65 78 70  derBy ){.    exp
27a70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
27a80 61 72 73 65 2c 20 22 4f 52 44 45 52 20 42 59 22  arse, "ORDER BY"
27a90 29 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53  );.    generateS
27aa0 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
27ab0 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  p, v, pEList->nE
27ac0 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  xpr, pDest);.  }
27ad0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
27ae0 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75   to skip this qu
27af0 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
27b00 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
27b10 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20  el(v, iEnd);..  
27b20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61  /* The SELECT wa
27b30 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
27b40 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20  oded.   Set the 
27b50 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30  return code to 0
27b60 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
27b70 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a  e no errors..  *
27b80 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f  /.  rc = 0;..  /
27b90 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20  * Control jumps 
27ba0 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72  to here if an er
27bb0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
27bc0 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f  ed above, or upo
27bd0 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75  n.  ** successfu
27be0 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  l coding of the 
27bf0 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c  SELECT..  */.sel
27c00 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61  ect_end:.  expla
27c10 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61  inSetInteger(pPa
27c20 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
27c30 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64  iRestoreSelectId
27c40 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66  );..  /* Identif
27c50 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  y column names i
27c60 66 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  f results of the
27c70 20 53 45 4c 45 43 54 20 61 72 65 20 74 6f 20 62   SELECT are to b
27c80 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20  e output..  */. 
27c90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27ca0 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65  OK && pDest->eDe
27cb0 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
27cc0 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  {.    generateCo
27cd0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
27ce0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
27cf0 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  st);.  }..  sqli
27d00 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41  te3DbFree(db, sA
27d10 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20  ggInfo.aCol);.  
27d20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
27d30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
27d40 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
27d50 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
27d60 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45  QLITE_ENABLE_TRE
27d70 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a  E_EXPLAIN)./*.**
27d80 20 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61   Generate a huma
27d90 6e 2d 72 65 61 64 61 62 6c 65 20 64 65 73 63 72  n-readable descr
27da0 69 70 74 69 6f 6e 20 6f 66 20 61 20 74 68 65 20  iption of a the 
27db0 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a  Select object..*
27dc0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
27dd0 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63 74 28 56  plainOneSelect(V
27de0 64 62 65 20 2a 70 56 64 62 65 2c 20 53 65 6c 65  dbe *pVdbe, Sele
27df0 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  ct *p){.  sqlite
27e00 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
27e10 56 64 62 65 2c 20 22 53 45 4c 45 43 54 20 22 29  Vdbe, "SELECT ")
27e20 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  ;.  if( p->selFl
27e30 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
27e40 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
27e50 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   ){.    if( p->s
27e60 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
27e70 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 73  tinct ){.      s
27e80 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
27e90 6e 74 66 28 70 56 64 62 65 2c 20 22 44 49 53 54  ntf(pVdbe, "DIST
27ea0 49 4e 43 54 20 22 29 3b 0a 20 20 20 20 7d 0a 20  INCT ");.    }. 
27eb0 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61     if( p->selFla
27ec0 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
27ed0 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
27ee0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
27ef0 70 56 64 62 65 2c 20 22 61 67 67 5f 66 6c 61 67  pVdbe, "agg_flag
27f00 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   ");.    }.    s
27f10 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
27f20 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71 6c 69  pVdbe);.    sqli
27f30 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
27f40 28 70 56 64 62 65 2c 20 22 20 20 20 22 29 3b 0a  (pVdbe, "   ");.
27f50 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
27f60 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70 56 64  lainExprList(pVd
27f70 62 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  be, p->pEList);.
27f80 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
27f90 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 69 66 28  NL(pVdbe);.  if(
27fa0 20 70 2d 3e 70 53 72 63 20 26 26 20 70 2d 3e 70   p->pSrc && p->p
27fb0 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20  Src->nSrc ){.   
27fc0 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69   int i;.    sqli
27fd0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
27fe0 28 70 56 64 62 65 2c 20 22 46 52 4f 4d 20 22 29  (pVdbe, "FROM ")
27ff0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
28000 6c 61 69 6e 50 75 73 68 28 70 56 64 62 65 29 3b  lainPush(pVdbe);
28010 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
28020 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69  p->pSrc->nSrc; i
28030 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
28040 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
28050 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63  pItem = &p->pSrc
28060 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71  ->a[i];.      sq
28070 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
28080 74 66 28 70 56 64 62 65 2c 20 22 7b 25 64 2c 2a  tf(pVdbe, "{%d,*
28090 7d 20 3d 20 22 2c 20 70 49 74 65 6d 2d 3e 69 43  } = ", pItem->iC
280a0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66  ursor);.      if
280b0 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
280c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
280d0 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74  te3ExplainSelect
280e0 28 70 56 64 62 65 2c 20 70 49 74 65 6d 2d 3e 70  (pVdbe, pItem->p
280f0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
28100 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62   if( pItem->pTab
28110 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
28120 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
28130 74 66 28 70 56 64 62 65 2c 20 22 20 28 74 61 62  tf(pVdbe, " (tab
28140 6e 61 6d 65 3d 25 73 29 22 2c 20 70 49 74 65 6d  name=%s)", pItem
28150 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  ->pTab->zName);.
28160 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28170 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d  }else if( pItem-
28180 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  >zName ){.      
28190 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
281a0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 25  Printf(pVdbe, "%
281b0 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  s", pItem->zName
281c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
281d0 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
281e0 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  as ){.        sq
281f0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
28200 74 66 28 70 56 64 62 65 2c 20 22 20 28 41 53 20  tf(pVdbe, " (AS 
28210 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  %s)", pItem->zAl
28220 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ias);.      }.  
28230 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a      if( pItem->j
28240 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
28250 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  T ){.        sql
28260 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
28270 66 28 70 56 64 62 65 2c 20 22 20 4c 45 46 54 2d  f(pVdbe, " LEFT-
28280 4a 4f 49 4e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  JOIN");.      }.
28290 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
282a0 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
282b0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
282c0 45 78 70 6c 61 69 6e 50 6f 70 28 70 56 64 62 65  ExplainPop(pVdbe
282d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
282e0 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71  pWhere ){.    sq
282f0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
28300 74 66 28 70 56 64 62 65 2c 20 22 57 48 45 52 45  tf(pVdbe, "WHERE
28310 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
28320 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62  ExplainExpr(pVdb
28330 65 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  e, p->pWhere);. 
28340 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
28350 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a  nNL(pVdbe);.  }.
28360 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42    if( p->pGroupB
28370 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
28380 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
28390 64 62 65 2c 20 22 47 52 4f 55 50 42 59 20 22 29  dbe, "GROUPBY ")
283a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
283b0 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70 56 64  lainExprList(pVd
283c0 62 65 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29  be, p->pGroupBy)
283d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
283e0 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
283f0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76   }.  if( p->pHav
28400 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ing ){.    sqlit
28410 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
28420 70 56 64 62 65 2c 20 22 48 41 56 49 4e 47 20 22  pVdbe, "HAVING "
28430 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
28440 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c  plainExpr(pVdbe,
28450 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
28460 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
28470 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20  NL(pVdbe);.  }. 
28480 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
28490 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
284a0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
284b0 62 65 2c 20 22 4f 52 44 45 52 42 59 20 22 29 3b  be, "ORDERBY ");
284c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
284d0 61 69 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62  ainExprList(pVdb
284e0 65 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  e, p->pOrderBy);
284f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
28500 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
28510 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  }.  if( p->pLimi
28520 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
28530 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
28540 64 62 65 2c 20 22 4c 49 4d 49 54 20 22 29 3b 0a  dbe, "LIMIT ");.
28550 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
28560 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d  inExpr(pVdbe, p-
28570 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >pLimit);.    sq
28580 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
28590 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Vdbe);.  }.  if(
285a0 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20   p->pOffset ){. 
285b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
285c0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
285d0 4f 46 46 53 45 54 20 22 29 3b 0a 20 20 20 20 73  OFFSET ");.    s
285e0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
285f0 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 4f 66 66  r(pVdbe, p->pOff
28600 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
28610 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
28620 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  );.  }.}.void sq
28630 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65  lite3ExplainSele
28640 63 74 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  ct(Vdbe *pVdbe, 
28650 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
28660 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ( p==0 ){.    sq
28670 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
28680 74 66 28 70 56 64 62 65 2c 20 22 28 6e 75 6c 6c  tf(pVdbe, "(null
28690 2d 73 65 6c 65 63 74 29 22 29 3b 0a 20 20 20 20  -select)");.    
286a0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 77 68  return;.  }.  wh
286b0 69 6c 65 28 20 70 2d 3e 70 50 72 69 6f 72 20 29  ile( p->pPrior )
286c0 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a   p = p->pPrior;.
286d0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
286e0 50 75 73 68 28 70 56 64 62 65 29 3b 0a 20 20 77  Push(pVdbe);.  w
286f0 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 65  hile( p ){.    e
28700 78 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63 74 28  xplainOneSelect(
28710 70 56 64 62 65 2c 20 70 29 3b 0a 20 20 20 20 70  pVdbe, p);.    p
28720 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
28730 20 69 66 28 20 70 3d 3d 30 20 29 20 62 72 65 61   if( p==0 ) brea
28740 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  k;.    sqlite3Ex
28750 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
28760 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
28770 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
28780 22 25 73 5c 6e 22 2c 20 73 65 6c 65 63 74 4f 70  "%s\n", selectOp
28790 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
287a0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  }.  sqlite3Expla
287b0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
287c0 22 45 4e 44 22 29 3b 0a 20 20 73 71 6c 69 74 65  "END");.  sqlite
287d0 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 56 64 62  3ExplainPop(pVdb
287e0 65 29 3b 0a 7d 0a 0a 2f 2a 20 45 6e 64 20 6f 66  e);.}../* End of
287f0 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 64   the structure d
28800 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f  ebug printing co
28810 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  de.*************
28820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28860 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  /.#endif /* defi
28870 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
28880 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 20  E_TREE_EXPLAIN) 
28890 2a 2f 0a                                         */.