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

Artifact 5c9f09de4ca3e12da17d1c5215b851ce3356891c:


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: 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20  if( pEList ){.  
aa30: 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d    nCol = pEList-
aa40: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c  >nExpr;.    aCol
aa50: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
aa60: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
aa70: 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29  f(aCol[0])*nCol)
aa80: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
aa90: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  aCol==0 );.  }el
aaa0: 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30  se{.    nCol = 0
aab0: 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a  ;.    aCol = 0;.
aac0: 20 20 7d 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e    }.  *pnCol = n
aad0: 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20  Col;.  *paCol = 
aae0: 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  aCol;..  for(i=0
aaf0: 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e  , pCol=aCol; i<n
ab00: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
ab10: 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  ){.    /* Get an
ab20: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d   appropriate nam
ab30: 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
ab40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20  .    */.    p = 
ab50: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
ab60: 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
ab70: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20  p->pRight==0 || 
ab80: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
ab90: 70 2d 3e 70 52 69 67 68 74 2c 20 45 50 5f 49 6e  p->pRight, EP_In
aba0: 74 56 61 6c 75 65 29 0a 20 20 20 20 20 20 20 20  tValue).        
abb0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 70 52 69         || p->pRi
abc0: 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d 30  ght->u.zToken==0
abd0: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 75   || p->pRight->u
abe0: 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b  .zToken[0]!=0 );
abf0: 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20  .    if( (zName 
ac00: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
ac10: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
ac20: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
ac30: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22  mn contains an "
ac40: 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73  AS <name>" phras
ac50: 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73  e, use <name> as
ac60: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   the name */.   
ac70: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
ac80: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
ac90: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
aca0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
acb0: 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20  olExpr = p;  /* 
acc0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
acd0: 68 61 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  hat is the resul
ace0: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  t column name */
acf0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
ad00: 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ab;         /* T
ad10: 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
ad20: 77 69 74 68 20 74 68 69 73 20 65 78 70 72 65 73  with this expres
ad30: 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68  sion */.      wh
ad40: 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f  ile( pColExpr->o
ad50: 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20  p==TK_DOT ){.   
ad60: 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20       pColExpr = 
ad70: 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74  pColExpr->pRight
ad80: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
ad90: 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b  ( pColExpr!=0 );
ada0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
adb0: 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
adc0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c  =TK_COLUMN && AL
add0: 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70  WAYS(pColExpr->p
ade0: 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  Tab!=0) ){.     
adf0: 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
ae00: 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  s use the column
ae10: 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   name name */.  
ae20: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
ae30: 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75   pColExpr->iColu
ae40: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  mn;.        pTab
ae50: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61   = pColExpr->pTa
ae60: 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  b;.        if( i
ae70: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
ae80: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
ae90: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
aea0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
aeb0: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
aec0: 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20        iCol>=0 ? 
aed0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
aee0: 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22  .zName : "rowid"
aef0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
af00: 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
af10: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
af20: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
af30: 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45  asProperty(pColE
af40: 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
af50: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  ) );.        zNa
af60: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
af70: 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70 43  ntf(db, "%s", pC
af80: 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  olExpr->u.zToken
af90: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
afa0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74          /* Use t
afb0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74  he original text
afc0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65   of the column e
afd0: 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73  xpression as its
afe0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
aff0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
b000: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
b010: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  , pEList->a[i].z
b020: 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Span);.      }. 
b030: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
b040: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
b050: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
b060: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
b070: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b080: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
b090: 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e   sure the column
b0a0: 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e   name is unique.
b0b0: 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73    If the name is
b0c0: 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20   not unique,.   
b0d0: 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74   ** append a int
b0e0: 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65  eger to the name
b0f0: 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f   so that it beco
b100: 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20  mes unique..    
b110: 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73  */.    nName = s
b120: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
b130: 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a  Name);.    for(j
b140: 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b  =cnt=0; j<i; j++
b150: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
b160: 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c  ite3StrICmp(aCol
b170: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [j].zName, zName
b180: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
b190: 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a  char *zNewName;.
b1a0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e          zName[nN
b1b0: 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ame] = 0;.      
b1c0: 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c    zNewName = sql
b1d0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
b1e0: 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20  "%s:%d", zName, 
b1f0: 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ++cnt);.        
b200: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
b210: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
b220: 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61    zName = zNewNa
b230: 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  me;.        j = 
b240: 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -1;.        if( 
b250: 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b  zName==0 ) break
b260: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b270: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20      pCol->zName 
b280: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69  = zName;.  }.  i
b290: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
b2a0: 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a  led ){.    for(j
b2b0: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
b2c0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
b2d0: 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a  ee(db, aCol[j].z
b2e0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
b2f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
b300: 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70  b, aCol);.    *p
b310: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70  aCol = 0;.    *p
b320: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65  nCol = 0;.    re
b330: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
b340: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
b350: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
b360: 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64  .** Add type and
b370: 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
b380: 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75  mation to a colu
b390: 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e  mn list based on
b3a0: 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61  .** a SELECT sta
b3b0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54  tement..** .** T
b3c0: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70  he column list p
b3d0: 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66  resumably came f
b3e0: 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  rom selectColumn
b3f0: 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73  NamesFromExprLis
b400: 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75  t()..** The colu
b410: 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79  mn list has only
b420: 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65   names, not type
b430: 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e  s or collations.
b440: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
b450: 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61  e goes through a
b460: 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65  nd adds the type
b470: 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
b480: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
b490: 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68  tine requires th
b4a0: 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65  at all identifie
b4b0: 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  rs in the SELECT
b4c0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65  .** statement be
b4d0: 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74   resolved..*/.st
b4e0: 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
b4f0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
b500: 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72  Collation(.  Par
b510: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
b520: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
b530: 6e 74 65 78 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ntexts */.  int 
b540: 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
b550: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
b560: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 43 6f 6c 75  olumns */.  Colu
b570: 6d 6e 20 2a 61 43 6f 6c 2c 20 20 20 20 20 20 20  mn *aCol,       
b580: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
b590: 75 6d 6e 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  umns */.  Select
b5a0: 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
b5b0: 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74  /* SELECT used t
b5c0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65  o determine type
b5d0: 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
b5e0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
b5f0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b600: 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  b;.  NameContext
b610: 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   sNC;.  Column *
b620: 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  pCol;.  CollSeq 
b630: 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b  *pColl;.  int i;
b640: 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74  .  Expr *p;.  st
b650: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
b660: 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74  em *a;..  assert
b670: 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ( pSelect!=0 );.
b680: 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65    assert( (pSele
b690: 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
b6a0: 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29  F_Resolved)!=0 )
b6b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c  ;.  assert( nCol
b6c0: 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ==pSelect->pELis
b6d0: 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  t->nExpr || db->
b6e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
b6f0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
b700: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
b710: 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20  .  memset(&sNC, 
b720: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
b730: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
b740: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
b750: 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e  .  a = pSelect->
b760: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72  pEList->a;.  for
b770: 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b  (i=0, pCol=aCol;
b780: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43   i<nCol; i++, pC
b790: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61  ol++){.    p = a
b7a0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [i].pExpr;.    p
b7b0: 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c  Col->zType = sql
b7c0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b7d0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
b7e0: 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a  , p, 0, 0, 0));.
b7f0: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
b800: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
b810: 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20  Affinity(p);.   
b820: 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e   if( pCol->affin
b830: 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61  ity==0 ) pCol->a
b840: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
b850: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 70  _AFF_NONE;.    p
b860: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
b870: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
b880: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , p);.    if( pC
b890: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
b8a0: 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  l->zColl = sqlit
b8b0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
b8c0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
b8d0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
b8e0: 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20   Given a SELECT 
b8f0: 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72  statement, gener
b900: 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75  ate a Table stru
b910: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
b920: 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  ibes.** the resu
b930: 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53  lt set of that S
b940: 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ELECT..*/.Table 
b950: 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65  *sqlite3ResultSe
b960: 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20  tOfSelect(Parse 
b970: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
b980: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62  *pSelect){.  Tab
b990: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69  le *pTab;.  sqli
b9a0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b9b0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65  ->db;.  int save
b9c0: 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64  dFlags;..  saved
b9d0: 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67  Flags = db->flag
b9e0: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  s;.  db->flags &
b9f0: 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f  = ~SQLITE_FullCo
ba00: 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c  lNames;.  db->fl
ba10: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
ba20: 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73  ortColNames;.  s
ba30: 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
ba40: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
ba50: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , 0);.  if( pPar
ba60: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
ba70: 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  n 0;.  while( pS
ba80: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20  elect->pPrior ) 
ba90: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
baa0: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d  t->pPrior;.  db-
bab0: 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c  >flags = savedFl
bac0: 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ags;.  pTab = sq
bad0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
bae0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
baf0: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
bb00: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  b==0 ){.    retu
bb10: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  rn 0;.  }.  /* T
bb20: 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  he sqlite3Result
bb30: 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 73 68  SetOfSelect() sh
bb40: 6f 75 6c 64 20 6f 6e 6c 79 20 75 73 65 64 20 69  ould only used i
bb50: 6e 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65  n contexts where
bb60: 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73   the.  ** lookas
bb70: 69 64 65 20 62 75 66 66 65 72 20 69 73 20 64 69  ide buffer is di
bb80: 73 61 62 6c 65 64 2e 20 2a 2f 0a 20 20 61 73 73  sabled. */.  ass
bb90: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
bba0: 64 65 2e 73 7a 3d 3d 30 20 29 3b 0a 20 20 70 54  de.sz==0 );.  pT
bbb0: 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
bbc0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  pTab->zName = 0;
bbd0: 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  .  pTab->nRowEst
bbe0: 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 73 65   = 1000000;.  se
bbf0: 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  lectColumnsFromE
bc00: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
bc10: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c  pSelect->pEList,
bc20: 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
bc30: 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65  Tab->aCol);.  se
bc40: 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
bc50: 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
bc60: 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  arse, pTab->nCol
bc70: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53  , pTab->aCol, pS
bc80: 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e  elect);.  pTab->
bc90: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66  iPKey = -1;.  if
bca0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
bcb0: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
bcc0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
bcd0: 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75   pTab);.    retu
bce0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
bcf0: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
bd00: 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72  * Get a VDBE for
bd10: 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65   the given parse
bd20: 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61  r context.  Crea
bd30: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
bd40: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66  necessary..** If
bd50: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
bd60: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
bd70: 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67  d leave a messag
bd80: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
bd90: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74  Vdbe *sqlite3Get
bda0: 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
bdb0: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
bdc0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
bdd0: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
bde0: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
bdf0: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dbe = sqlite3Vdb
be00: 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d 3e  eCreate(pParse->
be10: 64 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  db);.#ifndef SQL
be20: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20  ITE_OMIT_TRACE. 
be30: 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20     if( v ){.    
be40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
be50: 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61 63 65 29  Op0(v, OP_Trace)
be60: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
be70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d   }.  return v;.}
be80: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
be90: 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
bea0: 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
beb0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
bec0: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69  ed on the.** pLi
bed0: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
bee0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c  expressions.  pL
bef0: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
bf00: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
bf10: 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70  sions.** that ap
bf20: 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67  pear in the orig
bf30: 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
bf40: 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d  nt after the LIM
bf50: 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a  IT and OFFSET.**
bf60: 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e   keywords.  Or N
bf70: 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79  ULL if those key
bf80: 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65  words are omitte
bf90: 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  d. iLimit and iO
bfa0: 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68  ffset .** are th
bfb0: 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79  e integer memory
bfc0: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
bfd0: 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75  s for counters u
bfe0: 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a  sed to compute .
bff0: 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64  ** the limit and
c000: 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65   offset.  If the
c010: 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61  re is no limit a
c020: 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68  nd/or offset, th
c030: 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e  en .** iLimit an
c040: 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
c050: 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
c060: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
c070: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
c080: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
c090: 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
c0a0: 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
c0b0: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
c0c0: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
c0d0: 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a  t.  iLimit and.*
c0e0: 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  * iOffset should
c0f0: 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
c100: 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
c110: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a   default values.
c120: 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20  ** (usually but 
c130: 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70  not always -1) p
c140: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
c150: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
c160: 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21   Only if pLimit!
c170: 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30  =0 or pOffset!=0
c180: 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65   do the limit re
c190: 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72  gisters get.** r
c1a0: 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55  edefined.  The U
c1b0: 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
c1c0: 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70  r uses this prop
c1d0: 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a  erty to force.**
c1e0: 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68   the reuse of th
c1f0: 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64  e same limit and
c200: 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72   offset register
c210: 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c  s across multipl
c220: 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
c230: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
c240: 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69  c void computeLi
c250: 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72  mitRegisters(Par
c260: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
c270: 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61  ct *p, int iBrea
c280: 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  k){.  Vdbe *v = 
c290: 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20  0;.  int iLimit 
c2a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73  = 0;.  int iOffs
c2b0: 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c  et;.  int addr1,
c2c0: 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69   n;.  if( p->iLi
c2d0: 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  mit ) return;.. 
c2e0: 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54   /* .  ** "LIMIT
c2f0: 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77   -1" always show
c300: 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65  s all rows.  The
c310: 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20  re is some.  ** 
c320: 63 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75  contraversy abou
c330: 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65  t what the corre
c340: 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75  ct behavior shou
c350: 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20  ld be..  ** The 
c360: 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
c370: 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74  tation interpret
c380: 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d  s "LIMIT 0" to m
c390: 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73  ean.  ** no rows
c3a0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
c3b0: 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
c3c0: 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
c3d0: 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
c3e0: 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20  || p->pLimit!=0 
c3f0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  );.  if( p->pLim
c400: 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69  it ){.    p->iLi
c410: 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b  mit = iLimit = +
c420: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
c430: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
c440: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
c450: 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d     if( NEVER(v==
c460: 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  0) ) return;  /*
c470: 20 56 44 42 45 20 73 68 6f 75 6c 64 20 68 61 76   VDBE should hav
c480: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  e already been a
c490: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20 20  llocated */.    
c4a0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
c4b0: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d  sInteger(p->pLim
c4c0: 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20  it, &n) ){.     
c4d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c4e0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
c4f0: 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  , n, iLimit);.  
c500: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
c510: 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
c520: 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28  er"));.      if(
c530: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
c540: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c550: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
c560: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
c570: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c580: 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
c590: 77 20 3e 20 28 64 6f 75 62 6c 65 29 6e 20 29 20  w > (double)n ) 
c5a0: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
c5b0: 28 64 6f 75 62 6c 65 29 6e 3b 0a 20 20 20 20 20  (double)n;.     
c5c0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
c5d0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
c5e0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
c5f0: 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  Limit, iLimit);.
c600: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c610: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
c620: 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29  stBeInt, iLimit)
c630: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
c640: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
c650: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
c660: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c670: 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p2(v, OP_IfZero,
c680: 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29   iLimit, iBreak)
c690: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
c6a0: 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
c6b0: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
c6c0: 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61   iOffset = ++pPa
c6d0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
c6e0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
c6f0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
c700: 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  n extra register
c710: 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65   for limit+offse
c720: 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
c730: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
c740: 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69  e, p->pOffset, i
c750: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
c760: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c770: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
c780: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
c790: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
c7a0: 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  , "OFFSET counte
c7b0: 72 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72  r"));.      addr
c7c0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
c7d0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
c7e0: 73 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  s, iOffset);.   
c7f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c800: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
c810: 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b  er, 0, iOffset);
c820: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c830: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
c840: 64 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dr1);.      sqli
c850: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
c860: 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c   OP_Add, iLimit,
c870: 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65   iOffset, iOffse
c880: 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65  t+1);.      Vdbe
c890: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
c8a0: 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20  IT+OFFSET"));.  
c8b0: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
c8c0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
c8d0: 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69   OP_IfPos, iLimi
c8e0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
c8f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c900: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69  P_Integer, -1, i
c910: 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20  Offset+1);.     
c920: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
c930: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
c940: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
c950: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c960: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
c970: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
c980: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
c990: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
c9a0: 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68   for the iCol-th
c9b0: 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
c9c0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72  e result set for
c9d0: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65   the compound-se
c9e0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22  lect statement "
c9f0: 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  p".  Return NULL
ca00: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   if.** the colum
ca10: 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74  n has no default
ca20: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
ca30: 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  nce..**.** The c
ca40: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
ca50: 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  e for the compou
ca60: 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b  nd select is tak
ca70: 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c  en from the.** l
ca80: 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
ca90: 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74   the select that
caa0: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
cab0: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
cac0: 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
cad0: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
cae0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
caf0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
cb00: 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
cb10: 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  *pRet;.  if( p->
cb20: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
cb30: 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
cb40: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
cb50: 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
cb60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
cb70: 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  Ret = 0;.  }.  a
cb80: 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29  ssert( iCol>=0 )
cb90: 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20  ;.  if( pRet==0 
cba0: 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73  && iCol<p->pELis
cbb0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
cbc0: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
cbd0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
cbe0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
cbf0: 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  Col].pExpr);.  }
cc00: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
cc10: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
cc20: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
cc30: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46  _SELECT */../* F
cc40: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
cc50: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d   */.static int m
cc60: 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
cc70: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
cc80: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
cc90: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
cca0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
ccb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
ccc0: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
ccd0: 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
cce0: 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
ccf0: 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
cd00: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
cd10: 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
cd20: 0a 29 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  .);...#ifndef SQ
cd30: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
cd40: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
cd50: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
cd60: 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
cd70: 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  s a compound que
cd80: 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20  ry form from.** 
cd90: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
cda0: 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69  rate queries usi
cdb0: 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20  ng UNION, UNION 
cdc0: 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a  ALL, EXCEPT, or.
cdd0: 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a  ** INTERSECT.**.
cde0: 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
cdf0: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
ce00: 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
ce10: 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
ce20: 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
ce30: 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
ce40: 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
ce50: 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
ce60: 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
ce70: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
ce80: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
ce90: 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
cea0: 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
ceb0: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
cec0: 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
ced0: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
cee0: 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
cef0: 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
cf00: 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
cf10: 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
cf20: 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
cf30: 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
cf40: 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
cf50: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
cf60: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
cf70: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
cf80: 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
cf90: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
cfa0: 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
cfb0: 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
cfc0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
cfd0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
cfe0: 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
cff0: 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
d000: 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
d010: 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
d020: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
d030: 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
d040: 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
d050: 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
d060: 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
d070: 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
d080: 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
d090: 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
d0a0: 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
d0b0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
d0c0: 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
d0d0: 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
d0e0: 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
d0f0: 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
d100: 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
d110: 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
d120: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
d130: 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
d140: 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
d150: 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
d160: 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
d170: 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
d180: 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
d190: 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
d1a0: 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
d1b0: 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
d1c0: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
d1d0: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
d1e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
d1f0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
d200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d210: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
d220: 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
d230: 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
d240: 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
d250: 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
d260: 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
d270: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
d280: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
d290: 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
d2a0: 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
d2b0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
d2c0: 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
d2d0: 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
d2e0: 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
d2f0: 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
d300: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
d310: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
d320: 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
d330: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
d340: 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
d350: 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
d360: 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ination */.  Sel
d370: 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  ect *pDelete = 0
d380: 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73  ;  /* Chain of s
d390: 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f  imple selects to
d3a0: 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c   delete */.  sql
d3b0: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
d3c0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
d3d0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66  onnection */.#if
d3e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d3f0: 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
d400: 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20 20  Sub1;           
d410: 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65   /* EQP id of le
d420: 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ft-hand query */
d430: 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20  .  int iSub2;   
d440: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20           /* EQP 
d450: 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  id of right-hand
d460: 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66   query */.#endif
d470: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
d480: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
d490: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
d4a0: 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
d4b0: 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
d4c0: 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
d4d0: 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
d4e0: 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
d4f0: 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
d500: 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
d510: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
d520: 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
d530: 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
d540: 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
d550: 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 64 62 20  is much */.  db 
d560: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
d570: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
d580: 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
d590: 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74  rior->pRightmost
d5a0: 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73  !=pPrior );.  as
d5b0: 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52  sert( pPrior->pR
d5c0: 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69  ightmost==p->pRi
d5d0: 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64 65 73  ghtmost );.  des
d5e0: 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66  t = *pDest;.  if
d5f0: 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
d600: 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
d610: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d620: 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
d630: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
d640: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
d650: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
d660: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
d670: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
d680: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d690: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  t_end;.  }.  if(
d6a0: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
d6b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d6c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c  rorMsg(pParse,"L
d6d0: 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75  IMIT clause shou
d6e0: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
d6f0: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
d700: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
d710: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
d720: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
d730: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
d740: 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69  .  }..  v = sqli
d750: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
d760: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
d770: 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44  =0 );  /* The VD
d780: 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74  BE already creat
d790: 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75  ed by calling fu
d7a0: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  nction */..  /* 
d7b0: 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69  Create the desti
d7c0: 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79  nation temporary
d7d0: 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73   table if necess
d7e0: 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ary.  */.  if( d
d7f0: 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45  est.eDest==SRT_E
d800: 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61  phemTab ){.    a
d810: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
d820: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
d830: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d840: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64  OpenEphemeral, d
d850: 65 73 74 2e 69 50 61 72 6d 2c 20 70 2d 3e 70 45  est.iParm, p->pE
d860: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
d870: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
d880: 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55  ngeP5(v, BTREE_U
d890: 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 64  NORDERED);.    d
d8a0: 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
d8b0: 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Table;.  }..  /*
d8c0: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53   Make sure all S
d8d0: 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74  ELECTs in the st
d8e0: 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65  atement have the
d8f0: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
d900: 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e  elements.  ** in
d910: 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65   their result se
d920: 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ts..  */.  asser
d930: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  t( p->pEList && 
d940: 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29  pPrior->pEList )
d950: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  ;.  if( p->pELis
d960: 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72  t->nExpr!=pPrior
d970: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
d980: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65  ){.    if( p->se
d990: 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75  lFlags & SF_Valu
d9a0: 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  es ){.      sqli
d9b0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d9c0: 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20  se, "all VALUES 
d9d0: 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61  must have the sa
d9e0: 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72  me number of ter
d9f0: 6d 73 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ms");.    }else{
da00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
da10: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
da20: 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c  SELECTs to the l
da30: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66  eft and right of
da40: 20 25 73 22 0a 20 20 20 20 20 20 20 20 22 20 64   %s".        " d
da50: 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
da60: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
da70: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
da80: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
da90: 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  p));.    }.    r
daa0: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
dab0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
dac0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
dad0: 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61  ound SELECTs tha
dae0: 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  t have an ORDER 
daf0: 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61  BY clause are ha
db00: 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79  ndled separately
db10: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
db20: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
db30: 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
db40: 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65  ctOrderBy(pParse
db50: 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  , p, pDest);.  }
db60: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
db70: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66  code for the lef
db80: 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45  t and right SELE
db90: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  CT statements.. 
dba0: 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d   */.  switch( p-
dbb0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
dbc0: 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  TK_ALL: {.      
dbd0: 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20  int addr = 0;.  
dbe0: 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a      int nLimit;.
dbf0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
dc00: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b  Prior->pLimit );
dc10: 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
dc20: 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
dc30: 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
dc40: 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  >pOffset = p->pO
dc50: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70  ffset;.      exp
dc60: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
dc70: 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
dc80: 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
dc90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
dca0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
dcb0: 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20  Prior, &dest);. 
dcc0: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
dcd0: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66   0;.      p->pOf
dce0: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
dcf0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
dd00: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
dd10: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
dd20: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
dd30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
dd40: 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e  Limit = pPrior->
dd50: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  iLimit;.      p-
dd60: 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f  >iOffset = pPrio
dd70: 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  r->iOffset;.    
dd80: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
dd90: 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  ){.        addr 
dda0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
ddb0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op1(v, OP_IfZero
ddc0: 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20  , p->iLimit);.  
ddd0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
dde0: 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61  t((v, "Jump ahea
ddf0: 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68  d if LIMIT reach
de00: 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ed"));.      }. 
de10: 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
de20: 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
de30: 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
de40: 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
de50: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
de60: 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29  Parse, p, &dest)
de70: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
de80: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
de90: 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
dea0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
deb0: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
dec0: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
ded0: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70  >nSelectRow += p
dee0: 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
def0: 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  w;.      if( pPr
df00: 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20  ior->pLimit.    
df10: 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
df20: 72 49 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f  rIsInteger(pPrio
df30: 72 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d  r->pLimit, &nLim
df40: 69 74 29 0a 20 20 20 20 20 20 20 26 26 20 70 2d  it).       && p-
df50: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 28 64  >nSelectRow > (d
df60: 6f 75 62 6c 65 29 6e 4c 69 6d 69 74 20 0a 20 20  ouble)nLimit .  
df70: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
df80: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 28  ->nSelectRow = (
df90: 64 6f 75 62 6c 65 29 6e 4c 69 6d 69 74 3b 0a 20  double)nLimit;. 
dfa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
dfb0: 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20   addr ){.       
dfc0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
dfd0: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
dfe0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
dff0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
e000: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20  se TK_EXCEPT:.  
e010: 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
e020: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69   {.      int uni
e030: 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72  onTab;    /* Cur
e040: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
e050: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
e060: 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  e holding result
e070: 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20   */.      u8 op 
e080: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e  = 0;       /* On
e090: 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70  e of the SRT_ op
e0a0: 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c  erations to appl
e0b0: 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20  y to self */.   
e0c0: 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20     int priorOp; 
e0d0: 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20      /* The SRT_ 
e0e0: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70  operation to app
e0f0: 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65  ly to prior sele
e100: 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  cts */.      Exp
e110: 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66  r *pLimit, *pOff
e120: 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61  set; /* Saved va
e130: 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69  lues of p->nLimi
e140: 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74  t and p->nOffset
e150: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
e160: 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  dr;.      Select
e170: 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a  Dest uniondest;.
e180: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e190: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
e1a0: 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
e1b0: 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ase( p->op==TK_U
e1c0: 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72  NION );.      pr
e1d0: 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f  iorOp = SRT_Unio
e1e0: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  n;.      if( des
e1f0: 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70  t.eDest==priorOp
e200: 20 26 26 20 41 4c 57 41 59 53 28 21 70 2d 3e 70   && ALWAYS(!p->p
e210: 4c 69 6d 69 74 20 26 26 21 70 2d 3e 70 4f 66 66  Limit &&!p->pOff
e220: 73 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  set) ){.        
e230: 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20  /* We can reuse 
e240: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
e250: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
e260: 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20   SELECT to our. 
e270: 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e         ** right.
e280: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
e290: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
e2a0: 52 69 67 68 74 6d 6f 73 74 21 3d 70 20 29 3b 20  Rightmost!=p ); 
e2b0: 20 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70   /* Can only hap
e2c0: 70 65 6e 20 66 6f 72 20 6c 65 66 74 77 61 72 64  pen for leftward
e2d0: 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 20 20   elements.      
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
e300: 2a 20 6f 66 20 61 20 33 2d 77 61 79 20 6f 72 20  * of a 3-way or 
e310: 6d 6f 72 65 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f  more compound */
e320: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e330: 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b   p->pLimit==0 );
e340: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c        /* Not all
e350: 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64  owed on leftward
e360: 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   elements */.   
e370: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
e380: 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20  pOffset==0 );   
e390: 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64    /* Not allowed
e3a0: 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65   on leftward ele
e3b0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  ments */.       
e3c0: 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74   unionTab = dest
e3d0: 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65  .iParm;.      }e
e3e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
e3f0: 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  We will need to 
e400: 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74  create our own t
e410: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
e420: 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20  o hold the.     
e430: 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61     ** intermedia
e440: 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20  te results..    
e450: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
e460: 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65  nionTab = pParse
e470: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
e480: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
e490: 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
e4a0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
e4b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e4c0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
e4d0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
e4e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e4f0: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
e500: 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
e510: 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
e520: 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
e530: 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74         p->pRight
e540: 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  most->selFlags |
e550: 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  = SF_UsesEphemer
e560: 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  al;.        asse
e570: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
e580: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
e590: 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
e5a0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
e5b0: 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20   our left.      
e5c0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
e5d0: 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72   !pPrior->pOrder
e5e0: 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  By );.      sqli
e5f0: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
e600: 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72  t(&uniondest, pr
e610: 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29  iorOp, unionTab)
e620: 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
e630: 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
e640: 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
e650: 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
e660: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
e670: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
e680: 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
e690: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
e6a0: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
e6b0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
e6c0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
e6d0: 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
e6e0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
e6f0: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
e700: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45   if( p->op==TK_E
e710: 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20  XCEPT ){.       
e720: 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74   op = SRT_Except
e730: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e740: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e750: 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
e760: 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53  ;.        op = S
e770: 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
e780: 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
e790: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69  r = 0;.      pLi
e7a0: 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
e7b0: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
e7c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66   = 0;.      pOff
e7d0: 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
e7e0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
e7f0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e  et = 0;.      un
e800: 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20  iondest.eDest = 
e810: 6f 70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  op;.      explai
e820: 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
e830: 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
e840: 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
e850: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
e860: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
e870: 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20  uniondest);.    
e880: 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
e890: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
e8a0: 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74     /* Query flat
e8b0: 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65  tening in sqlite
e8c0: 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20  3Select() might 
e8d0: 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72  refill p->pOrder
e8e0: 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20  By..      ** Be 
e8f0: 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70  sure to delete p
e900: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72  ->pOrderBy, ther
e910: 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20  efore, to avoid 
e920: 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a  a memory leak. *
e930: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
e940: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
e950: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
e960: 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
e970: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
e980: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
e990: 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  ior;.      p->pO
e9a0: 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
e9b0: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
e9c0: 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c 65  UNION ) p->nSele
e9d0: 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d  ctRow += pPrior-
e9e0: 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
e9f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
ea00: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
ea10: 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  it);.      p->pL
ea20: 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
ea30: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
ea40: 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  = pOffset;.     
ea50: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->iLimit = 0;.
ea60: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
ea70: 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   = 0;..      /* 
ea80: 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61  Convert the data
ea90: 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
eaa0: 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61  y table into wha
eab0: 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20  tever form.     
eac0: 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77   ** it is that w
ead0: 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64  e currently need
eae0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
eaf0: 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61   assert( unionTa
eb00: 62 3d 3d 64 65 73 74 2e 69 50 61 72 6d 20 7c 7c  b==dest.iParm ||
eb10: 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
eb20: 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66  orOp );.      if
eb30: 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  ( dest.eDest!=pr
eb40: 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20  iorOp ){.       
eb50: 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
eb60: 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
eb70: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
eb80: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20  EList );.       
eb90: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
eba0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
ebb0: 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
ebc0: 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
ebd0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46         while( pF
ebe0: 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
ebf0: 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
ec00: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
ec10: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
ec20: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
ec30: 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
ec40: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ec50: 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
ec60: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
ec70: 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43  l(v);.        iC
ec80: 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
ec90: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
eca0: 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69         computeLi
ecb0: 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
ecc0: 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
ecd0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ece0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ecf0: 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61  _Rewind, unionTa
ed00: 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  b, iBreak);.    
ed10: 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
ed20: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
ed30: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
ed40: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
ed50: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
ed60: 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  List, unionTab, 
ed70: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
ed80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ed90: 20 20 20 20 20 20 20 20 20 20 30 2c 20 2d 31 2c            0, -1,
eda0: 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
edb0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
edc0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
edd0: 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
ede0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
edf0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ee00: 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61  OP_Next, unionTa
ee10: 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20  b, iStart);.    
ee20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
ee30: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
ee40: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
ee50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ee60: 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  2(v, OP_Close, u
ee70: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
ee80: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
ee90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
eea0: 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e  ult: assert( p->
eeb0: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
eec0: 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
eed0: 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20  tab1, tab2;.    
eee0: 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
eef0: 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
ef00: 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c     Expr *pLimit,
ef10: 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20   *pOffset;.     
ef20: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
ef30: 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65   SelectDest inte
ef40: 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20  rsectdest;.     
ef50: 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20   int r1;..      
ef60: 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20  /* INTERSECT is 
ef70: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
ef80: 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20  he others since 
ef90: 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  it requires.    
efa0: 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
efb0: 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
efc0: 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
efd0: 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
efe0: 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
eff0: 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
f000: 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
f010: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62      */.      tab
f020: 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
f030: 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d  ++;.      tab2 =
f040: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
f050: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f060: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
f070: 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ..      addr = s
f080: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f090: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
f0a0: 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a  eral, tab1, 0);.
f0b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
f0c0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
f0d0: 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
f0e0: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
f0f0: 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
f100: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e   p->pRightmost->
f110: 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
f120: 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
f130: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
f140: 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20  EList );..      
f150: 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
f160: 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  CTs to our left 
f170: 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
f180: 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20  able "tab1"..   
f190: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
f1a0: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
f1b0: 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  t(&intersectdest
f1c0: 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
f1d0: 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  1);.      explai
f1e0: 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
f1f0: 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  1, pParse->iNext
f200: 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
f210: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
f220: 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
f230: 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65  or, &intersectde
f240: 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  st);.      if( r
f250: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
f260: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
f270: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
f280: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
f290: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e  urrent SELECT in
f2a0: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
f2b0: 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20  le "tab2".      
f2c0: 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  */.      addr = 
f2d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f2e0: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
f2f0: 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b  meral, tab2, 0);
f300: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f310: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
f320: 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
f330: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
f340: 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [1] = addr;.    
f350: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
f360: 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
f370: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
f380: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
f390: 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
f3a0: 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
f3b0: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
f3c0: 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63  ;.      intersec
f3d0: 74 64 65 73 74 2e 69 50 61 72 6d 20 3d 20 74 61  tdest.iParm = ta
f3e0: 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  b2;.      explai
f3f0: 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
f400: 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
f410: 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
f420: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
f430: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
f440: 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
f450: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f460: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
f470: 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
f480: 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
f490: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
f4a0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rior;.      if( 
f4b0: 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50  p->nSelectRow>pP
f4c0: 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
f4d0: 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
f4e0: 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   = pPrior->nSele
f4f0: 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c  ctRow;.      sql
f500: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
f510: 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
f520: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
f530: 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
f540: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
f550: 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  set;..      /* G
f560: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
f570: 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65  take the interse
f580: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f  ction of the two
f590: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
f5a0: 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20   ** tables..    
f5b0: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
f5c0: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
f5d0: 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
f5e0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
f5f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65   ){.        Sele
f600: 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
f610: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
f620: 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
f630: 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
f640: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
f650: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
f660: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
f670: 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
f680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f690: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
f6a0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
f6b0: 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
f6c0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
f6d0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f  bel(v);.      co
f6e0: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
f6f0: 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
f700: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
f710: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f720: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
f730: 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  b1, iBreak);.   
f740: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
f750: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
f760: 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20  );.      iStart 
f770: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f780: 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79  Op2(v, OP_RowKey
f790: 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20  , tab1, r1);.   
f7a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f7b0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f  dOp4Int(v, OP_No
f7c0: 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43  tFound, tab2, iC
f7d0: 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20  ont, r1, 0);.   
f7e0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
f7f0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
f800: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65   r1);.      sele
f810: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
f820: 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
f830: 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73  , tab1, p->pELis
f840: 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  t->nExpr,.      
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f860: 30 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69 43  0, -1, &dest, iC
f870: 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
f880: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
f890: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
f8a0: 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cont);.      sql
f8b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f8c0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c  , OP_Next, tab1,
f8d0: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
f8e0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
f8f0: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
f900: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
f910: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f920: 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30  P_Close, tab2, 0
f930: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f940: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f950: 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29  _Close, tab1, 0)
f960: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f970: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c     }.  }..  expl
f980: 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61  ainComposite(pPa
f990: 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62  rse, p->op, iSub
f9a0: 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21  1, iSub2, p->op!
f9b0: 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20  =TK_ALL);..  /* 
f9c0: 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e  Compute collatin
f9d0: 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64  g sequences used
f9e0: 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72   by .  ** tempor
f9f0: 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65  ary tables neede
fa00: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
fa10: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
fa20: 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20  ct..  ** Attach 
fa30: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
fa40: 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d  cture to all tem
fa50: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20  porary tables.. 
fa60: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65   **.  ** This se
fa70: 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20  ction is run by 
fa80: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53  the right-most S
fa90: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
faa0: 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43  only..  ** SELEC
fab0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
fac0: 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20  the left always 
fad0: 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20  skip this part. 
fae0: 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   The right-most.
faf0: 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68    ** SELECT migh
fb00: 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73  t also skip this
fb10: 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20   part if it has 
fb20: 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
fb30: 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74  se and.  ** no t
fb40: 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72  emp tables are r
fb50: 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
fb60: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
fb70: 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  & SF_UsesEphemer
fb80: 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  al ){.    int i;
fb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fba0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
fbb0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b  counter */.    K
fbc0: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
fbd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
fbe0: 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
fbf0: 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ce for the resul
fc00: 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c  t set */.    Sel
fc10: 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  ect *pLoop;     
fc20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
fc30: 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
fc40: 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  h SELECT stateme
fc50: 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  nts */.    CollS
fc60: 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20  eq **apColl;    
fc70: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
fc80: 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
fc90: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
fca0: 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  ] */.    int nCo
fcb0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
fcc0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
fcd0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72   of columns in r
fce0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
fcf0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
fd00: 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20  ghtmost==p );.  
fd10: 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69    nCol = p->pELi
fd20: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70  st->nExpr;.    p
fd30: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
fd40: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
fd50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fd60: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
fd70: 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a  *pKeyInfo)+nCol*
fd80: 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
fd90: 29 20 2b 20 31 29 29 3b 0a 20 20 20 20 69 66 28  ) + 1));.    if(
fda0: 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
fdb0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
fdc0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
fdd0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
fde0: 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  nd;.    }..    p
fdf0: 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45  KeyInfo->enc = E
fe00: 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 4b 65 79  NC(db);.    pKey
fe10: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28  Info->nField = (
fe20: 75 31 36 29 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66  u16)nCol;..    f
fe30: 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70  or(i=0, apColl=p
fe40: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20  KeyInfo->aColl; 
fe50: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43  i<nCol; i++, apC
fe60: 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61  oll++){.      *a
fe70: 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
fe80: 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
fe90: 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
fea0: 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29  if( 0==*apColl )
feb0: 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c  {.        *apCol
fec0: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
fed0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
fee0: 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ..    for(pLoop=
fef0: 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
ff00: 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  pLoop->pPrior){.
ff10: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ff20: 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
ff30: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f    int addr = pLo
ff40: 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
ff50: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
ff60: 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20   addr<0 ){.     
ff70: 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69       /* If [0] i
ff80: 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31  s unused then [1
ff90: 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64  ] is also unused
ffa0: 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20  .  So we can.   
ffb0: 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
ffc0: 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73   safely abort as
ffd0: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72   soon as the fir
ffe0: 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69  st unused slot i
fff0: 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  s found */.     
10000 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
10010 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
10020 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20  [1]<0 );.       
10030 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10040 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
10050 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
10060 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a  v, addr, nCol);.
10070 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10080 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
10090 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79  ddr, (char*)pKey
100a0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
100b0 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  );.        pLoop
100c0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
100d0 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  ] = -1;.      }.
100e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
100f0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4b 65 79  3DbFree(db, pKey
10100 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74  Info);.  }..mult
10110 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  i_select_end:.  
10120 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 64 65  pDest->iMem = de
10130 73 74 2e 69 4d 65 6d 3b 0a 20 20 70 44 65 73 74  st.iMem;.  pDest
10140 2d 3e 6e 4d 65 6d 20 3d 20 64 65 73 74 2e 6e 4d  ->nMem = dest.nM
10150 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  em;.  sqlite3Sel
10160 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  ectDelete(db, pD
10170 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e  elete);.  return
10180 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
10190 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
101a0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
101b0 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f  ./*.** Code an o
101c0 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
101d0 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65   for a coroutine
101e0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
101f0 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  of a.** SELECT s
10200 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  tatment..**.** T
10210 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75  he data to be ou
10220 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65  tput is containe
10230 64 20 69 6e 20 70 49 6e 2d 3e 69 4d 65 6d 2e 20  d in pIn->iMem. 
10240 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49   There are.** pI
10250 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c 75 6d 6e 73 20  n->nMem columns 
10260 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70  to be output.  p
10270 44 65 73 74 20 69 73 20 77 68 65 72 65 20 74 68  Dest is where th
10280 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a  e output should.
10290 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a  ** be sent..**.*
102a0 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73 20 74  * regReturn is t
102b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  he number of the
102c0 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   register holdin
102d0 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  g the subroutine
102e0 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65  .** return addre
102f0 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67  ss..**.** If reg
10300 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69  Prev>0 then it i
10310 73 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  s the first regi
10320 73 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72  ster in a vector
10330 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73   that.** records
10340 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75   the previous ou
10350 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72  tput.  mem[regPr
10360 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68  ev] is a flag th
10370 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69  at is false.** i
10380 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e  f there has been
10390 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74   no previous out
103a0 70 75 74 2e 20 20 49 66 20 72 65 67 50 72 65 76  put.  If regPrev
103b0 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a  >0 then code is.
103c0 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  ** generated to 
103d0 73 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  suppress duplica
103e0 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69  tes.  pKeyInfo i
103f0 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61  s used for compa
10400 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a  ring.** keys..**
10410 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54  .** If the LIMIT
10420 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69   found in p->iLi
10430 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c 20  mit is reached, 
10440 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
10450 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a   to.** iBreak..*
10460 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e  /.static int gen
10470 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
10480 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a  utine(.  Parse *
10490 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
104a0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
104b0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
104c0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
104d0 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
104e0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65  tatement */.  Se
104f0 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20  lectDest *pIn,  
10500 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69        /* Corouti
10510 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74  ne supplying dat
10520 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
10530 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
10540 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20  * Where to send 
10550 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  the data */.  in
10560 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20  t regReturn,    
10570 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
10580 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
10590 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
105a0 67 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20  gPrev,          
105b0 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65    /* Previous re
105c0 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20  sult register.  
105d0 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66  No uniqueness if
105e0 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20   0 */.  KeyInfo 
105f0 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
10600 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67  /* For comparing
10610 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 65   with previous e
10620 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 34  ntry */.  int p4
10630 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
10640 20 20 2f 2a 20 54 68 65 20 70 34 20 74 79 70 65    /* The p4 type
10650 20 66 6f 72 20 70 4b 65 79 49 6e 66 6f 20 2a 2f   for pKeyInfo */
10660 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
10670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
10680 6d 70 20 68 65 72 65 20 69 66 20 77 65 20 68 69  mp here if we hi
10690 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29  t the LIMIT */.)
106a0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
106b0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
106c0 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  nt iContinue;.  
106d0 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64  int addr;..  add
106e0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
106f0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
10700 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
10710 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
10720 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  l(v);..  /* Supp
10730 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 20  ress duplicates 
10740 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  for UNION, EXCEP
10750 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
10760 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67   .  */.  if( reg
10770 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20  Prev ){.    int 
10780 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d  j1, j2;.    j1 =
10790 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
107a0 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
107b0 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 6a 32  regPrev);.    j2
107c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
107d0 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
107e0 72 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 72  re, pIn->iMem, r
107f0 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e  egPrev+1, pIn->n
10800 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Mem,.           
10810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10820 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
10830 66 6f 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 20  fo, p4type);.   
10840 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10850 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a  p3(v, OP_Jump, j
10860 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  2+2, iContinue, 
10870 6a 32 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  j2+2);.    sqlit
10880 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
10890 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , j1);.    sqlit
108a0 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70  e3ExprCodeCopy(p
108b0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d  Parse, pIn->iMem
108c0 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
108d0 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c  ->nMem);.    sql
108e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
108f0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
10900 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20   regPrev);.  }. 
10910 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
10920 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
10930 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
10940 53 75 70 70 72 65 73 73 20 74 68 65 20 74 68 65  Suppress the the
10950 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e   first OFFSET en
10960 74 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69  tries if there i
10970 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75  s an OFFSET clau
10980 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66  se.  */.  codeOf
10990 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
109a0 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69 74 63 68  inue);..  switch
109b0 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29  ( pDest->eDest )
109c0 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  {.    /* Store t
109d0 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
109e0 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
109f0 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
10a00 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
10a10 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
10a20 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
10a30 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
10a40 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
10a50 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32  e);.      int r2
10a60 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
10a70 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
10a80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44      testcase( pD
10a90 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
10aa0 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74  Table );.      t
10ab0 65 73 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e  estcase( pDest->
10ac0 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
10ad0 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  Tab );.      sql
10ae0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
10af0 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
10b00 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d   pIn->iMem, pIn-
10b10 3e 6e 4d 65 6d 2c 20 72 31 29 3b 0a 20 20 20 20  >nMem, r1);.    
10b20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10b30 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
10b40 69 64 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  id, pDest->iParm
10b50 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
10b60 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
10b70 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65  , OP_Insert, pDe
10b80 73 74 2d 3e 69 50 61 72 6d 2c 20 72 31 2c 20 72  st->iParm, r1, r
10b90 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
10ba0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
10bb0 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
10bc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
10bd0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
10be0 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
10bf0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
10c00 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
10c10 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10c20 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
10c30 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
10c40 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  ERY.    /* If we
10c50 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20   are creating a 
10c60 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72  set for an "expr
10c70 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
10c80 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20  " construct,.   
10c90 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73   ** then there s
10ca0 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c  hould be a singl
10cb0 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  e item on the st
10cc0 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73  ack.  Write this
10cd0 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74  .    ** item int
10ce0 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20  o the set table 
10cf0 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e  with bogus data.
10d00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
10d10 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
10d20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20    int r1;.      
10d30 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65  assert( pIn->nMe
10d40 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  m==1 );.      p-
10d50 3e 61 66 66 69 6e 69 74 79 20 3d 20 0a 20 20 20  >affinity = .   
10d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
10d70 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 2d 3e  pareAffinity(p->
10d80 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
10d90 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 69 6e  pr, pDest->affin
10da0 69 74 79 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  ity);.      r1 =
10db0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
10dc0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
10dd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10de0 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
10df0 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c  cord, pIn->iMem,
10e00 20 31 2c 20 72 31 2c 20 26 70 2d 3e 61 66 66 69   1, r1, &p->affi
10e10 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
10e20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
10e30 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
10e40 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d  Parse, pIn->iMem
10e50 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
10e60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10e70 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
10e80 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72 31 29  Dest->iParm, r1)
10e90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
10ea0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
10eb0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
10ec0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
10ed0 69 66 20 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f  if 0  /* Never o
10ee0 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45  ccurs on an ORDE
10ef0 52 20 42 59 20 71 75 65 72 79 20 2a 2f 0a 20 20  R BY query */.  
10f00 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
10f10 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
10f20 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
10f30 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
10f40 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
10f50 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
10f60 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
10f70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10f80 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 44 65  _Integer, 1, pDe
10f90 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20  st->iParm);.    
10fa0 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
10fb0 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
10fc0 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
10fd0 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
10fe0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
10ff0 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  f..    /* If thi
11000 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
11010 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
11020 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
11030 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
11040 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
11050 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
11060 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
11070 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
11080 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
11090 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
110a0 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
110b0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
110c0 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b   pIn->nMem==1 );
110d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
110e0 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
110f0 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44  e, pIn->iMem, pD
11100 65 73 74 2d 3e 69 50 61 72 6d 2c 20 31 29 3b 0a  est->iParm, 1);.
11110 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
11120 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
11130 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
11140 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
11150 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11160 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
11170 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
11180 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
11190 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  /* The results a
111a0 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
111b0 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
111c0 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72  ters.    ** star
111d0 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69  ting at pDest->i
111e0 4d 65 6d 2e 20 20 54 68 65 6e 20 74 68 65 20 63  Mem.  Then the c
111f0 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73  o-routine yields
11200 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
11210 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
11220 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65   {.      if( pDe
11230 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20  st->iMem==0 ){. 
11240 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 4d         pDest->iM
11250 65 6d 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  em = sqlite3GetT
11260 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
11270 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20   pIn->nMem);.   
11280 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d       pDest->nMem
11290 20 3d 20 70 49 6e 2d 3e 6e 4d 65 6d 3b 0a 20 20   = pIn->nMem;.  
112a0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
112b0 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
112c0 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65  pParse, pIn->iMe
112d0 6d 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20  m, pDest->iMem, 
112e0 70 44 65 73 74 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  pDest->nMem);.  
112f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11300 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
11310 64 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29  d, pDest->iParm)
11320 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11330 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
11340 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76  none of the abov
11350 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  e, then the resu
11360 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d  lt destination m
11370 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52  ust be.    ** SR
11380 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20  T_Output.  This 
11390 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
113a0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79   called with any
113b0 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65   other.    ** de
113c0 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20  stination other 
113d0 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61  than the ones ha
113e0 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53  ndled above or S
113f0 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a  RT_Output..    *
11400 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54  *.    ** For SRT
11410 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73  _Output, results
11420 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61   are stored in a
11430 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67   sequence of reg
11440 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a  isters.  .    **
11450 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73   Then the OP_Res
11460 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73  ultRow opcode is
11470 20 75 73 65 64 20 74 6f 20 63 61 75 73 65 20 73   used to cause s
11480 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f  qlite3_step() to
11490 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74  .    ** return t
114a0 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72  he next row of r
114b0 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  esult..    */.  
114c0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
114d0 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74     assert( pDest
114e0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
114f0 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  put );.      sql
11500 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11510 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
11520 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e  pIn->iMem, pIn->
11530 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  nMem);.      sql
11540 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
11550 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
11560 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70  se, pIn->iMem, p
11570 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  In->nMem);.     
11580 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11590 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
115a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
115b0 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
115c0 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
115d0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
115e0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
115f0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11600 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  _IfZero, p->iLim
11610 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b  it, iBreak, -1);
11620 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
11630 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69  ate the subrouti
11640 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20  ne return.  */. 
11650 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
11660 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
11670 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65  tinue);.  sqlite
11680 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11690 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74  P_Return, regRet
116a0 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  urn);..  return 
116b0 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  addr;.}../*.** A
116c0 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f  lternative compo
116d0 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20  und select code 
116e0 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61  generator for ca
116f0 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a  ses when there.*
11700 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  * is an ORDER BY
11710 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57   clause..**.** W
11720 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79  e assume a query
11730 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
11740 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  g form:.**.**   
11750 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f     <selectA>  <o
11760 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63  perator>  <selec
11770 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f  tB>  ORDER BY <o
11780 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a  rderbylist>.**.*
11790 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
117a0 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c  one of UNION ALL
117b0 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  , UNION, EXCEPT,
117c0 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20   or INTERSECT.  
117d0 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74  The idea.** is t
117e0 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c  o code both <sel
117f0 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63  ectA> and <selec
11800 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44  tB> with the ORD
11810 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a  ER BY clause as.
11820 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20  ** co-routines. 
11830 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f   Then run the co
11840 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72  -routines in par
11850 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20  allel and merge 
11860 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
11870 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20  nto the output. 
11880 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
11890 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
118a0 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63  es (called selec
118b0 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74  tA and.** select
118c0 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73  B) there are 7 s
118d0 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a  ubroutines:.**.*
118e0 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f  *    outA:    Mo
118f0 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
11900 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72   the selectA cor
11910 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
11920 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
11930 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
11940 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a  pound query..**.
11950 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d  **    outB:    M
11960 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
11970 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f  f the selectB co
11980 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
11990 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
119a0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
119b0 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28  mpound query.  (
119c0 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66  Only generated f
119d0 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20  or UNION and.** 
119e0 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
119f0 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61  N ALL.  EXCEPT a
11a00 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65  nd INSERTSECT ne
11a10 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77  ver output a row
11a20 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
11a30 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c       appears onl
11a40 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20  y in B.).**.**  
11a50 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65    AltB:    Calle
11a60 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
11a70 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
11a80 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c  oroutines and A<
11a90 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42  B..**.**    AeqB
11aa0 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
11ab0 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
11ac0 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
11ad0 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a  nes and A==B..**
11ae0 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20  .**    AgtB:    
11af0 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
11b00 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
11b10 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
11b20 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A>B..**.**   
11b30 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64   EofA:    Called
11b40 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
11b50 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
11b60 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45  ectA..**.**    E
11b70 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofB:    Called w
11b80 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
11b90 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
11ba0 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  tB..**.** The im
11bb0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
11bc0 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20  the latter five 
11bd0 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65  subroutines depe
11be0 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20  nd on which .** 
11bf0 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73  <operator> is us
11c00 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed:.**.**.**    
11c10 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
11c20 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e  LL         UNION
11c30 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45              EXCE
11c40 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45  PT          INTE
11c50 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  RSECT.**        
11c60 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20    ------------- 
11c70 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
11c80 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
11c90 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
11ca0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a  -----.**   AltB:
11cb0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
11cc0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
11cd0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
11ce0 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a  A         nextA.
11cf0 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20  **.**   AeqB:   
11d00 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
11d10 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
11d20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
11d30 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a      outA, nextA.
11d40 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20  **.**   AgtB:   
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 6e 65 78 74 42 20 20 20 20 20        nextB     
11d80 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a         nextB.**.
11d90 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74  **   EofA:   out
11da0 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
11db0 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
11dc0 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20     halt         
11dd0 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20      halt.**.**  
11de0 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e   EofB:   outA, n
11df0 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
11e00 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
11e10 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
11e20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  halt.**.** In th
11e30 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e  e AltB, AeqB, an
11e40 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e  d AgtB subroutin
11e50 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20  es, an EOF on A 
11e60 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a  following nextA.
11e70 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d  ** causes an imm
11e80 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
11e90 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f  ofA and an EOF o
11ea0 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n B following ne
11eb0 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e  xtB causes.** an
11ec0 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
11ed0 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e  to EofB.  Within
11ee0 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20   EofA and EofB, 
11ef0 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79  and EOF on entry
11f00 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   or.** following
11f10 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20   nextX causes a 
11f20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  jump to the end 
11f30 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72  of the select pr
11f40 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
11f50 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  Duplicate remova
11f60 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20  l in the UNION, 
11f70 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
11f80 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68  RSECT cases is h
11f90 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e  andled.** within
11fa0 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
11fb0 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67  outine.  The reg
11fc0 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65  Prev register se
11fd0 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76  t holds the prev
11fe0 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74  iously.** output
11ff0 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61   value.  A compa
12000 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67  rison is made ag
12010 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65  ainst this value
12020 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
12030 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ** is skipped if
12040 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74   the next result
12050 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73  s would be the s
12060 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69  ame as the previ
12070 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ous..**.** The i
12080 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c  mplementation pl
12090 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65  an is to impleme
120a0 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  nt the two corou
120b0 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a  tines and seven.
120c0 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66  ** subroutines f
120d0 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74  irst, then put t
120e0 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63  he control logic
120f0 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20   at the bottom. 
12100 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Like this:.**.*
12110 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  *          goto 
12120 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a  Init.**     coA:
12130 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
12140 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a  eft query (A).**
12150 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74       coB: corout
12160 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75  ine for right qu
12170 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75  ery (B).**    ou
12180 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tA: output one r
12190 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75  ow of A.**    ou
121a0 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tB: output one r
121b0 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61  ow of B (UNION a
121c0 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c  nd UNION ALL onl
121d0 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e  y).**    EofA: .
121e0 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e  ...**    EofB: .
121f0 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e  ...**    AltB: .
12200 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e  ...**    AeqB: .
12210 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e  ...**    AgtB: .
12220 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69  ...**    Init: i
12230 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74  nitialize corout
12240 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a  ine registers.**
12250 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
12260 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coA.**          
12270 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45  if eof(A) goto E
12280 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ofA.**          
12290 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20  yield coB.**    
122a0 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20        if eof(B) 
122b0 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20  goto EofB.**    
122c0 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c  Cmpr: Compare A,
122d0 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a   B.**          J
122e0 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  ump AltB, AeqB, 
122f0 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a  AgtB.**     End:
12300 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61   ....**.** We ca
12310 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  ll AltB, AeqB, A
12320 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45  gtB, EofA, and E
12330 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73  ofB "subroutines
12340 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e  " but they are n
12350 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63  ot.** actually c
12360 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75  alled using Gosu
12370 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f  b and they do no
12380 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20  t Return.  EofA 
12390 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a  and EofB loop.**
123a0 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20   until all data 
123b0 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65  is exhausted the
123c0 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65  n jump to the "e
123d0 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c  nd" labe.  AltB,
123e0 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67   AeqB,.** and Ag
123f0 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65  tB jump to eithe
12400 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f  r L2 or to one o
12410 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a  f EofA or EofB..
12420 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
12430 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
12440 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e  SELECT.static in
12450 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
12460 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
12470 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
12480 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
12490 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
124a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
124b0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
124c0 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
124d0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
124e0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
124f0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
12500 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
12510 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
12520 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
12530 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
12540 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
12550 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
12560 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
12570 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
12580 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
12590 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
125a0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
125b0 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
125c0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
125d0 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stA;     /* Dest
125e0 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
125f0 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c  utine A */.  Sel
12600 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20  ectDest destB;  
12610 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
12620 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
12630 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  B */.  int regAd
12640 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drA;         /* 
12650 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
12660 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f   for select-A co
12670 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
12680 20 72 65 67 45 6f 66 41 3b 20 20 20 20 20 20 20   regEofA;       
12690 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e     /* Flag to in
126a0 64 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65  dicate when sele
126b0 63 74 2d 41 20 69 73 20 63 6f 6d 70 6c 65 74 65  ct-A is complete
126c0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
126d0 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rB;         /* A
126e0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
126f0 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  for select-B cor
12700 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
12710 72 65 67 45 6f 66 42 3b 20 20 20 20 20 20 20 20  regEofB;        
12720 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64    /* Flag to ind
12730 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63  icate when selec
12740 74 2d 42 20 69 73 20 63 6f 6d 70 6c 65 74 65 20  t-B is complete 
12750 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
12760 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectA;      /* Ad
12770 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
12780 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
12790 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
127a0 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectB;      /* Ad
127b0 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
127c0 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
127d0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41  */.  int regOutA
127e0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
127f0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
12800 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  or the output-A 
12810 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
12820 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20  int regOutB;    
12830 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
12840 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
12850 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
12860 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
12870 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20  ddrOutA;        
12880 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
12890 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
128a0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
128b0 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20  addrOutB = 0;   
128c0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
128d0 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
128e0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
128f0 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20   addrEofA;      
12900 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
12910 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78   the select-A-ex
12920 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
12930 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
12940 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofB;         /*
12950 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
12960 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74  select-B-exhaust
12970 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
12980 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b  .  int addrAltB;
12990 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
129a0 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73  ess of the A<B s
129b0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
129c0 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20  nt addrAeqB;    
129d0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
129e0 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72  of the A==B subr
129f0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
12a00 61 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20  addrAgtB;       
12a10 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
12a20 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69  the A>B subrouti
12a30 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  ne */.  int regL
12a40 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a  imitA;        /*
12a50 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
12a60 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
12a70 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b    int regLimitB;
12a80 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74          /* Limit
12a90 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
12aa0 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20  lect-A */.  int 
12ab0 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20  regPrev;        
12ac0 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20    /* A range of 
12ad0 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  registers to hol
12ae0 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  d previous outpu
12af0 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  t */.  int saved
12b00 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  Limit;       /* 
12b10 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70  Saved value of p
12b20 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e  ->iLimit */.  in
12b30 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20  t savedOffset;  
12b40 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
12b50 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74  ue of p->iOffset
12b60 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43   */.  int labelC
12b70 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  mpr;        /* L
12b80 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61  abel for the sta
12b90 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20  rt of the merge 
12ba0 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69  algorithm */.  i
12bb0 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20  nt labelEnd;    
12bc0 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
12bd0 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
12be0 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20   overall SELECT 
12bf0 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31  stmt */.  int j1
12c00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12c10 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74  /* Jump instruct
12c20 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65  ions that get re
12c30 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69  targetted */.  i
12c40 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
12c50 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
12c60 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c  K_ALL, TK_UNION,
12c70 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49   TK_EXCEPT, TK_I
12c80 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65  NTERSECT */.  Ke
12c90 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d  yInfo *pKeyDup =
12ca0 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f   0; /* Compariso
12cb0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
12cc0 72 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  r duplicate remo
12cd0 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  val */.  KeyInfo
12ce0 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f   *pKeyMerge;   /
12cf0 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
12d00 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72  ormation for mer
12d10 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73  ging rows */.  s
12d20 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
12d30 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
12d40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
12d50 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
12d60 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy;   /* The OR
12d70 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
12d80 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
12d90 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
12da0 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
12db0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
12dc0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  se */.  int *aPe
12dd0 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  rmute;        /*
12de0 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52   Mapping from OR
12df0 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20  DER BY terms to 
12e00 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d  result set colum
12e10 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ns */.#ifndef SQ
12e20 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
12e30 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20  N.  int iSub1;  
12e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
12e50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64   id of left-hand
12e60 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
12e70 69 53 75 62 32 3b 20 20 20 20 20 20 20 20 20 20  iSub2;          
12e80 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72    /* EQP id of r
12e90 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20  ight-hand query 
12ea0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
12eb0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
12ec0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
12ed0 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f   pKeyDup==0 ); /
12ee0 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65  * "Managed" code
12ef0 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69   needs this.  Ti
12f00 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20  cket #3382. */. 
12f10 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
12f20 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
12f30 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
12f40 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
12f50 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e  * Already thrown
12f60 20 74 68 65 20 65 72 72 6f 72 20 69 66 20 56 44   the error if VD
12f70 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20  BE alloc failed 
12f80 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20  */.  labelEnd = 
12f90 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
12fa0 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c  abel(v);.  label
12fb0 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Cmpr = sqlite3Vd
12fc0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
12fd0 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20  ..  /* Patch up 
12fe0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
12ff0 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  use.  */.  op = 
13000 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f  p->op;  .  pPrio
13010 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
13020 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
13030 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
13040 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
13050 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65  pOrderBy;.  asse
13060 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a  rt( pOrderBy );.
13070 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
13080 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20  derBy->nExpr;.. 
13090 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72   /* For operator
130a0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  s other than UNI
130b0 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74  ON ALL we have t
130c0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
130d0 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  .  ** the ORDER 
130e0 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73  BY clause covers
130f0 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74   every term of t
13100 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
13110 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74  Add.  ** terms t
13120 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
13130 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61  lause as necessa
13140 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ry..  */.  if( o
13150 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
13160 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61   for(i=1; db->ma
13170 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26  llocFailed==0 &&
13180 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   i<=p->pEList->n
13190 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
131a0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
131b0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
131c0 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
131d0 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
131e0 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b   j<nOrderBy; j++
131f0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
13200 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
13210 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  m->iOrderByCol>0
13220 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
13230 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43  pItem->iOrderByC
13240 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20  ol==i ) break;. 
13250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
13260 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a   j==nOrderBy ){.
13270 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
13280 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
13290 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
132a0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
132b0 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
132c0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
132d0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
132e0 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
132f0 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
13300 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a  ->u.iValue = i;.
13310 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
13320 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
13330 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
13340 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29   pOrderBy, pNew)
13350 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
13360 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42  rderBy ) pOrderB
13370 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d  y->a[nOrderBy++]
13380 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28  .iOrderByCol = (
13390 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  u16)i;.      }. 
133a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
133b0 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61  ompute the compa
133c0 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f  rison permutatio
133d0 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68  n and keyinfo th
133e0 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a  at is used with.
133f0 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61    ** the permuta
13400 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74  tion used to det
13410 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65  ermine if the ne
13420 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72  xt.  ** row of r
13430 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f  esults comes fro
13440 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c  m selectA or sel
13450 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20  ectB.  Also add 
13460 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f  explicit.  ** co
13470 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  llations to the 
13480 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
13490 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68  terms so that wh
134a0 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65  en the subquerie
134b0 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69  s.  ** to the ri
134c0 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74  ght and the left
134d0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20   are evaluated, 
134e0 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72  they use the cor
134f0 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  rect.  ** collat
13500 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72  ion..  */.  aPer
13510 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62  mute = sqlite3Db
13520 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
13530 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72  zeof(int)*nOrder
13540 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d  By);.  if( aPerm
13550 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ute ){.    struc
13560 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
13570 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28  *pItem;.    for(
13580 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  i=0, pItem=pOrde
13590 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72  rBy->a; i<nOrder
135a0 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  By; i++, pItem++
135b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
135c0 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79   pItem->iOrderBy
135d0 43 6f 6c 3e 30 20 20 26 26 20 70 49 74 65 6d 2d  Col>0  && pItem-
135e0 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d  >iOrderByCol<=p-
135f0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
13600 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65  ;.      aPermute
13610 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 69 4f 72  [i] = pItem->iOr
13620 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20  derByCol - 1;.  
13630 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67    }.    pKeyMerg
13640 65 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e =.      sqlite
13650 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
13660 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 4d 65 72   sizeof(*pKeyMer
13670 67 65 29 2b 6e 4f 72 64 65 72 42 79 2a 28 73 69  ge)+nOrderBy*(si
13680 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
13690 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79  ));.    if( pKey
136a0 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20 70  Merge ){.      p
136b0 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f  KeyMerge->aSortO
136c0 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 4b 65  rder = (u8*)&pKe
136d0 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 6e 4f  yMerge->aColl[nO
136e0 72 64 65 72 42 79 5d 3b 0a 20 20 20 20 20 20 70  rderBy];.      p
136f0 4b 65 79 4d 65 72 67 65 2d 3e 6e 46 69 65 6c 64  KeyMerge->nField
13700 20 3d 20 28 75 31 36 29 6e 4f 72 64 65 72 42 79   = (u16)nOrderBy
13710 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67  ;.      pKeyMerg
13720 65 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  e->enc = ENC(db)
13730 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
13740 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
13750 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
13760 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
13770 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d     Expr *pTerm =
13780 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
13790 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
137a0 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  f( pTerm->flags 
137b0 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  & EP_ExpCollate 
137c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ){.          pCo
137d0 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 43 6f 6c  ll = pTerm->pCol
137e0 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  l;.        }else
137f0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
13800 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
13810 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
13820 2c 20 61 50 65 72 6d 75 74 65 5b 69 5d 29 3b 0a  , aPermute[i]);.
13830 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d            pTerm-
13840 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70  >flags |= EP_Exp
13850 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20  Collate;.       
13860 20 20 20 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c 20     pTerm->pColl 
13870 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  = pColl;.       
13880 20 7d 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d   }.        pKeyM
13890 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  erge->aColl[i] =
138a0 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20   pColl;.        
138b0 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74  pKeyMerge->aSort
138c0 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65  Order[i] = pOrde
138d0 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
138e0 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  der;.      }.   
138f0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
13900 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20  pKeyMerge = 0;. 
13910 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63   }..  /* Reattac
13920 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
13930 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65  lause to the que
13940 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f  ry..  */.  p->pO
13950 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
13960 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72  y;.  pPrior->pOr
13970 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
13980 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73  xprListDup(pPars
13990 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c  e->db, pOrderBy,
139a0 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63   0);..  /* Alloc
139b0 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74  ate a range of t
139c0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
139d0 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e  rs and the KeyIn
139e0 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66  fo needed.  ** f
139f0 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  or the logic tha
13a00 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63  t removes duplic
13a10 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20  ate result rows 
13a20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70  when the.  ** op
13a30 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c  erator is UNION,
13a40 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45   EXCEPT, or INTE
13a50 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55  RSECT (but not U
13a60 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a  NION ALL)..  */.
13a70 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
13a80 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20   ){.    regPrev 
13a90 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
13aa0 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d    int nExpr = p-
13ab0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
13ac0 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64      assert( nOrd
13ad0 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64  erBy>=nExpr || d
13ae0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
13af0 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  );.    regPrev =
13b00 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
13b10 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78  ange(pParse, nEx
13b20 70 72 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  pr+1);.    sqlit
13b30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13b40 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
13b50 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65  egPrev);.    pKe
13b60 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33 44 62  yDup = sqlite3Db
13b70 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20  MallocZero(db,. 
13b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b90 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 44 75 70   sizeof(*pKeyDup
13ba0 29 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f  ) + nExpr*(sizeo
13bb0 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29  f(CollSeq*)+1) )
13bc0 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44 75  ;.    if( pKeyDu
13bd0 70 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 44  p ){.      pKeyD
13be0 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  up->aSortOrder =
13bf0 20 28 75 38 2a 29 26 70 4b 65 79 44 75 70 2d 3e   (u8*)&pKeyDup->
13c00 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20  aColl[nExpr];.  
13c10 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 6e 46 69      pKeyDup->nFi
13c20 65 6c 64 20 3d 20 28 75 31 36 29 6e 45 78 70 72  eld = (u16)nExpr
13c30 3b 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d  ;.      pKeyDup-
13c40 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a  >enc = ENC(db);.
13c50 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
13c60 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nExpr; i++){.  
13c70 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
13c80 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53  Coll[i] = multiS
13c90 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
13ca0 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
13cb0 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f      pKeyDup->aSo
13cc0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a  rtOrder[i] = 0;.
13cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13ce0 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74  }. .  /* Separat
13cf0 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74  e the left and t
13d00 68 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66  he right query f
13d10 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a  rom one another.
13d20 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72    */.  p->pPrior
13d30 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52   = 0;.  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 2c 20 70 2d  By(pParse, p, p-
13d60 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
13d70 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f  R");.  if( pPrio
13d80 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a  r->pPrior==0 ){.
13d90 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
13da0 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
13db0 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70  Parse, pPrior, p
13dc0 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c  Prior->pOrderBy,
13dd0 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a   "ORDER");.  }..
13de0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
13df0 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73   limit registers
13e00 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d   */.  computeLim
13e10 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
13e20 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29  se, p, labelEnd)
13e30 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
13e40 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  t && op==TK_ALL 
13e50 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41  ){.    regLimitA
13e60 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
13e70 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42  m;.    regLimitB
13e80 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
13e90 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
13ea0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
13eb0 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20  opy, p->iOffset 
13ec0 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a  ? p->iOffset+1 :
13ed0 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20   p->iLimit,.    
13ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
13f00 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71  gLimitA);.    sq
13f10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13f20 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c  v, OP_Copy, regL
13f30 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42  imitA, regLimitB
13f40 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
13f50 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c  regLimitA = regL
13f60 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20  imitB = 0;.  }. 
13f70 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
13f80 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
13f90 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  );.  p->pLimit =
13fa0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
13fb0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
13fc0 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f  Offset);.  p->pO
13fd0 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65  ffset = 0;..  re
13fe0 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73  gAddrA = ++pPars
13ff0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f  e->nMem;.  regEo
14000 66 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  fA = ++pParse->n
14010 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20  Mem;.  regAddrB 
14020 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
14030 3b 0a 20 20 72 65 67 45 6f 66 42 20 3d 20 2b 2b  ;.  regEofB = ++
14040 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
14050 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72  regOutA = ++pPar
14060 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
14070 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utB = ++pParse->
14080 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53  nMem;.  sqlite3S
14090 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
140a0 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estA, SRT_Corout
140b0 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  ine, regAddrA);.
140c0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
140d0 65 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20  estInit(&destB, 
140e0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
140f0 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20  egAddrB);..  /* 
14100 4a 75 6d 70 20 70 61 73 74 20 74 68 65 20 76 61  Jump past the va
14110 72 69 6f 75 73 20 73 75 62 72 6f 75 74 69 6e 65  rious subroutine
14120 73 20 61 6e 64 20 63 6f 72 6f 75 74 69 6e 65 73  s and coroutines
14130 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a   to the main.  *
14140 2a 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a  * merge loop.  *
14150 2f 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33  /.  j1 = sqlite3
14160 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
14170 5f 47 6f 74 6f 29 3b 0a 20 20 61 64 64 72 53 65  _Goto);.  addrSe
14180 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56  lectA = sqlite3V
14190 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
141a0 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  );...  /* Genera
141b0 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74  te a coroutine t
141c0 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53  o evaluate the S
141d0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
141e0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74  to the.  ** left
141f0 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
14200 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20   operator - the 
14210 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  "A" select..  */
14220 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
14230 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63 6f  nt((v, "Begin co
14240 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74  routine for left
14250 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50   SELECT"));.  pP
14260 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  rior->iLimit = r
14270 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c  egLimitA;.  expl
14280 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
14290 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
142a0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73  xtSelectId);.  s
142b0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
142c0 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
142d0 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  stA);.  sqlite3V
142e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
142f0 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45  Integer, 1, regE
14300 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
14310 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
14320 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
14330 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ;.  VdbeNoopComm
14340 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72  ent((v, "End cor
14350 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20  outine for left 
14360 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a  SELECT"));..  /*
14370 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f   Generate a coro
14380 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74  utine to evaluat
14390 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
143a0 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20  tement on .  ** 
143b0 74 68 65 20 72 69 67 68 74 20 2d 20 74 68 65 20  the right - the 
143c0 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a  "B" select.  */.
143d0 20 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20    addrSelectB = 
143e0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
143f0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 56 64 62  ntAddr(v);.  Vdb
14400 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
14410 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e   "Begin coroutin
14420 65 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45  e for right SELE
14430 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69  CT"));.  savedLi
14440 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
14450 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d  .  savedOffset =
14460 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70   p->iOffset;.  p
14470 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69  ->iLimit = regLi
14480 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  mitB;.  p->iOffs
14490 65 74 20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c  et = 0;  .  expl
144a0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
144b0 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
144c0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73  xtSelectId);.  s
144d0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
144e0 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b  rse, p, &destB);
144f0 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73  .  p->iLimit = s
14500 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e  avedLimit;.  p->
14510 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f  iOffset = savedO
14520 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  ffset;.  sqlite3
14530 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14540 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
14550 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofB);.  sqlite3
14560 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
14570 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
14580 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  );.  VdbeNoopCom
14590 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 63 6f  ment((v, "End co
145a0 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68  routine for righ
145b0 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20  t SELECT"));..  
145c0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
145d0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
145e0 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e  tputs the curren
145f0 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20  t row of the A. 
14600 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68   ** select as th
14610 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f  e next output ro
14620 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  w of the compoun
14630 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  d select..  */. 
14640 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
14650 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75  ((v, "Output rou
14660 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20  tine for A"));. 
14670 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65   addrOutA = gene
14680 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75  rateOutputSubrou
14690 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20  tine(pParse,.   
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
146b0 20 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20   &destA, pDest, 
146c0 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20  regOutA,.       
146d0 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65            regPre
146e0 76 2c 20 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b  v, pKeyDup, P4_K
146f0 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 2c 20  EYINFO_HANDOFF, 
14700 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20  labelEnd);.  .  
14710 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
14720 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
14730 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e  tputs the curren
14740 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20  t row of the B. 
14750 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68   ** select as th
14760 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f  e next output ro
14770 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  w of the compoun
14780 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  d select..  */. 
14790 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
147a0 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
147b0 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  ){.    VdbeNoopC
147c0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
147d0 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42  ut routine for B
147e0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74  "));.    addrOut
147f0 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70  B = generateOutp
14800 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61  utSubroutine(pPa
14810 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
14820 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c        p, &destB,
14830 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c   pDest, regOutB,
14840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14850 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44    regPrev, pKeyD
14860 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53  up, P4_KEYINFO_S
14870 54 41 54 49 43 2c 20 6c 61 62 65 6c 45 6e 64 29  TATIC, labelEnd)
14880 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
14890 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
148a0 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68  e to run when th
148b0 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73  e results from s
148c0 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65  elect A.  ** are
148d0 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f   exhausted and o
148e0 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65  nly data in sele
148f0 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20  ct B remains..  
14900 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
14910 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20  ment((v, "eof-A 
14920 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
14930 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45   if( op==TK_EXCE
14940 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54  PT || op==TK_INT
14950 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
14960 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33  drEofA = sqlite3
14970 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14980 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 45  _Goto, 0, labelE
14990 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  nd);.  }else{  .
149a0 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73      addrEofA = s
149b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
149c0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
149d0 66 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  fB, labelEnd);. 
149e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
149f0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
14a00 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
14a10 75 74 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  utB);.    sqlite
14a20 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
14a30 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
14a40 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  B);.    sqlite3V
14a50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14a60 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66  Goto, 0, addrEof
14a70 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65  A);.    p->nSele
14a80 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d  ctRow += pPrior-
14a90 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d  >nSelectRow;.  }
14aa0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
14ab0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
14ac0 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
14ad0 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
14ae0 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   B.  ** are exha
14af0 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
14b00 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20  ata in select A 
14b10 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
14b20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
14b30 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
14b40 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b  EofB = addrEofA;
14b50 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c  .    if( p->nSel
14b60 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d  ectRow > pPrior-
14b70 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d  >nSelectRow ) p-
14b80 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
14b90 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
14ba0 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
14bb0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
14bc0 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72  ((v, "eof-B subr
14bd0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
14be0 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65  ddrEofB = sqlite
14bf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14c00 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 6c  P_If, regEofA, l
14c10 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71  abelEnd);.    sq
14c20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14c30 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
14c40 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b  OutA, addrOutA);
14c50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14c60 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
14c70 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ld, regAddrA);. 
14c80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14c90 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
14ca0 20 30 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20   0, addrEofB);. 
14cb0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
14cc0 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
14cd0 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42   the case of A<B
14ce0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
14cf0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c  Comment((v, "A-l
14d00 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
14d10 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20  );.  addrAltB = 
14d20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14d30 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
14d40 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
14d50 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14d60 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
14d70 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ld, regAddrA);. 
14d80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14d90 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
14da0 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b  EofA, addrEofA);
14db0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14dc0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
14dd0 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
14de0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
14df0 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
14e00 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20  e case of A==B. 
14e10 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
14e20 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72  _ALL ){.    addr
14e30 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
14e40 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
14e50 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
14e60 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20  .    addrAeqB = 
14e70 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64  addrAltB;.    ad
14e80 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73  drAltB++;.  }els
14e90 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  e{.    VdbeNoopC
14ea0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71  omment((v, "A-eq
14eb0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
14ec0 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  ;.    addrAeqB =
14ed0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14ee0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
14ef0 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ld, regAddrA);. 
14f00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14f10 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
14f20 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41  egEofA, addrEofA
14f30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14f40 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
14f50 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
14f60 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  r);.  }..  /* Ge
14f70 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
14f80 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
14f90 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A>B.  */.  Vdb
14fa0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
14fb0 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74   "A-gt-B subrout
14fc0 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67  ine"));.  addrAg
14fd0 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
14fe0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
14ff0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
15000 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
15010 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
15020 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15030 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
15040 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20  addrOutB);.  }. 
15050 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15060 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
15070 72 65 67 41 64 64 72 42 29 3b 0a 20 20 73 71 6c  regAddrB);.  sql
15080 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15090 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42  , OP_If, regEofB
150a0 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 73  , addrEofB);.  s
150b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
150c0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
150d0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
150e0 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73  * This code runs
150f0 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c   once to initial
15100 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a  ize everything..
15110 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
15120 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
15130 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15140 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
15150 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66 41  eger, 0, regEofA
15160 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15170 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
15180 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66 42  eger, 0, regEofB
15190 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
151a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
151b0 75 62 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ub, regAddrA, ad
151c0 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 73 71  drSelectA);.  sq
151d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
151e0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
151f0 41 64 64 72 42 2c 20 61 64 64 72 53 65 6c 65 63  AddrB, addrSelec
15200 74 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tB);.  sqlite3Vd
15210 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
15220 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72  f, regEofA, addr
15230 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofA);.  sqlite3
15240 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15250 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64  _If, regEofB, ad
15260 64 72 45 6f 66 42 29 3b 0a 0a 20 20 2f 2a 20 49  drEofB);..  /* I
15270 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69  mplement the mai
15280 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a  n merge loop.  *
15290 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
152a0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
152b0 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c  abelCmpr);.  sql
152c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
152d0 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e  , OP_Permutation
152e0 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
152f0 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49  *)aPermute, P4_I
15300 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69  NTARRAY);.  sqli
15310 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
15320 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73   OP_Compare, des
15330 74 41 2e 69 4d 65 6d 2c 20 64 65 73 74 42 2e 69  tA.iMem, destB.i
15340 4d 65 6d 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20  Mem, nOrderBy,. 
15350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15360 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
15370 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59  KeyMerge, P4_KEY
15380 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
15390 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
153a0 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
153b0 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71  ddrAltB, addrAeq
153c0 42 2c 20 61 64 64 72 41 67 74 42 29 3b 0a 0a 20  B, addrAgtB);.. 
153d0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 65 6d 70   /* Release temp
153e0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 0a  orary registers.
153f0 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72    */.  if( regPr
15400 65 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ev ){.    sqlite
15410 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
15420 65 28 70 50 61 72 73 65 2c 20 72 65 67 50 72 65  e(pParse, regPre
15430 76 2c 20 6e 4f 72 64 65 72 42 79 2b 31 29 3b 0a  v, nOrderBy+1);.
15440 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
15450 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74  o the this point
15460 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72   in order to ter
15470 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79  minate the query
15480 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
15490 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
154a0 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a  (v, labelEnd);..
154b0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d    /* Set the num
154c0 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f  ber of output co
154d0 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28  lumns.  */.  if(
154e0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
154f0 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
15500 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
15510 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68  = pPrior;.    wh
15520 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
15530 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
15540 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
15550 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
15560 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
15570 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
15580 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  );.  }..  /* Rea
15590 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70  ssembly the comp
155a0 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68  ound query so th
155b0 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72  at it will be fr
155c0 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  eed correctly.  
155d0 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ** by the callin
155e0 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  g function */.  
155f0 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
15600 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
15610 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  ctDelete(db, p->
15620 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70  pPrior);.  }.  p
15630 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
15640 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20  r;..  /*** TBD: 
15650 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69   Insert subrouti
15660 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73  ne calls to clos
15670 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63  e cursors on inc
15680 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73  omplete.  **** s
15690 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a  ubqueries ****/.
156a0 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69    explainComposi
156b0 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70  te(pParse, p->op
156c0 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20  , iSub1, iSub2, 
156d0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  0);.  return SQL
156e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
156f0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
15700 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
15710 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
15720 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
15730 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  W)./* Forward De
15740 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74  clarations */.st
15750 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
15760 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a  xprList(sqlite3*
15770 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74  , ExprList*, int
15780 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
15790 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
157a0 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20  elect(sqlite3*, 
157b0 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45  Select *, int, E
157c0 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a  xprList *);../*.
157d0 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
157e0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
157f0 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
15800 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
15810 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
15820 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
15830 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
15840 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d   of the iColumn-
15850 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  th.** entry in p
15860 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
15870 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
15880 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
15890 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
158a0 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ).**.** This rou
158b0 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20  tine is part of 
158c0 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70  the flattening p
158d0 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62  rocedure.  A sub
158e0 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72  query.** whose r
158f0 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66  esult set is def
15900 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61  ined by pEList a
15910 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20  ppears as entry 
15920 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  in the.** FROM c
15930 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
15940 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  T such that the 
15950 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69  VDBE cursor assi
15960 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20  gned to that.** 
15970 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FORM clause entr
15980 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68  y is iTable.  Th
15990 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20  is routine make 
159a0 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a  the necessary .*
159b0 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78  * changes to pEx
159c0 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65  pr so that it re
159d0 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
159e0 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
159f0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71  e.** of the subq
15a00 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20  uery rather the 
15a10 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
15a20 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
15a30 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73  tatic Expr *subs
15a40 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33  tExpr(.  sqlite3
15a50 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
15a60 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
15a70 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e  rors to this con
15a80 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
15a90 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
15aa0 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
15ab0 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
15ac0 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ccurs */.  int i
15ad0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  Table,         /
15ae0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
15af0 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
15b00 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
15b10 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
15b20 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
15b30 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
15b40 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
15b50 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
15b60 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
15b70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
15b80 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
15b90 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
15ba0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
15bb0 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
15bc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
15bd0 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61  r *pNew;.      a
15be0 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
15bf0 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
15c00 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  mn<pEList->nExpr
15c10 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
15c20 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
15c30 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
15c40 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ht==0 );.      p
15c50 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
15c60 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d  rDup(db, pEList-
15c70 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
15c80 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  n].pExpr, 0);.  
15c90 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20      if( pNew && 
15ca0 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 7b 0a  pExpr->pColl ){.
15cb0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43          pNew->pC
15cc0 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f  oll = pExpr->pCo
15cd0 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
15ce0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
15cf0 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
15d00 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e        pExpr = pN
15d10 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ew;.    }.  }els
15d20 65 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  e{.    pExpr->pL
15d30 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28  eft = substExpr(
15d40 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  db, pExpr->pLeft
15d50 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
15d60 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52  );.    pExpr->pR
15d70 69 67 68 74 20 3d 20 73 75 62 73 74 45 78 70 72  ight = substExpr
15d80 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  (db, pExpr->pRig
15d90 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ht, iTable, pELi
15da0 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  st);.    if( Exp
15db0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
15dc0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
15dd0 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ) ){.      subst
15de0 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72  Select(db, pExpr
15df0 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61  ->x.pSelect, iTa
15e00 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
15e10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
15e20 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
15e30 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
15e40 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
15e50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
15e60 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74  turn pExpr;.}.st
15e70 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
15e80 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74  xprList(.  sqlit
15e90 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
15ea0 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
15eb0 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a   errors here */.
15ec0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
15ed0 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74  t,     /* List t
15ee0 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68  o scan and in wh
15ef0 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
15f00 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74  titutes */.  int
15f10 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
15f20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
15f30 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a   substituted */.
15f40 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
15f50 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69  st     /* Substi
15f60 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29  tute values */.)
15f70 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
15f80 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
15f90 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
15fa0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
15fb0 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  ++){.    pList->
15fc0 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62  a[i].pExpr = sub
15fd0 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74  stExpr(db, pList
15fe0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54  ->a[i].pExpr, iT
15ff0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
16000 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
16010 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20   substSelect(.  
16020 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
16030 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
16040 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
16050 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
16060 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
16070 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
16080 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
16090 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a   substitutions *
160a0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
160b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
160c0 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64  e to be replaced
160d0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
160e0 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75  pEList     /* Su
160f0 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20  bstitute values 
16100 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  */.){.  SrcList 
16110 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20  *pSrc;.  struct 
16120 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
16130 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
16140 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b  if( !p ) return;
16150 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
16160 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
16170 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
16180 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
16190 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
161a0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
161b0 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  );.  substExprLi
161c0 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  st(db, p->pOrder
161d0 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
161e0 73 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e  st);.  p->pHavin
161f0 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  g = substExpr(db
16200 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54  , p->pHaving, iT
16210 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
16220 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62   p->pWhere = sub
16230 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57  stExpr(db, p->pW
16240 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45  here, iTable, pE
16250 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65  List);.  substSe
16260 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69  lect(db, p->pPri
16270 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  or, iTable, pELi
16280 73 74 29 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  st);.  pSrc = p-
16290 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
162a0 20 70 53 72 63 20 29 3b 20 20 2f 2a 20 45 76 65   pSrc );  /* Eve
162b0 6e 20 66 6f 72 20 28 53 45 4c 45 43 54 20 31 29  n for (SELECT 1)
162c0 20 77 65 20 68 61 76 65 3a 20 70 53 72 63 21 3d   we have: pSrc!=
162d0 30 20 62 75 74 20 70 53 72 63 2d 3e 6e 53 72 63  0 but pSrc->nSrc
162e0 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57  ==0 */.  if( ALW
162f0 41 59 53 28 70 53 72 63 29 20 29 7b 0a 20 20 20  AYS(pSrc) ){.   
16300 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
16310 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61  c, pItem=pSrc->a
16320 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
16330 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73  m++){.      subs
16340 74 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74 65  tSelect(db, pIte
16350 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  m->pSelect, iTab
16360 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
16370 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20   }.  }.}.#endif 
16380 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
16390 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
163a0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
163b0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
163c0 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
163d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
163e0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
163f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
16400 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  IEW)./*.** This 
16410 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
16420 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71   to flatten subq
16430 75 65 72 69 65 73 20 61 73 20 61 20 70 65 72 66  ueries as a perf
16440 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ormance optimiza
16450 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
16460 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 20  utine returns 1 
16470 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e  if it makes chan
16480 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20  ges and 0 if no 
16490 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75 72  flattening occur
164a0 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65  s..**.** To unde
164b0 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65  rstand the conce
164c0 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  pt of flattening
164d0 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66  , consider the f
164e0 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72  ollowing.** quer
164f0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  y:.**.**     SEL
16500 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45  ECT a FROM (SELE
16510 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
16520 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29   t1 WHERE z<100)
16530 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a   WHERE a>5.**.**
16540 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79   The default way
16550 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
16560 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74   this query is t
16570 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a  o execute the.**
16580 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20   subquery first 
16590 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
165a0 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f  sults in a tempo
165b0 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  rary table, then
165c0 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65  .** run the oute
165d0 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20  r query on that 
165e0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
165f0 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20    This requires 
16600 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76  two.** passes ov
16610 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75  er the data.  Fu
16620 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75  rthermore, becau
16630 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  se the temporary
16640 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f   table.** has no
16650 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48   indices, the WH
16660 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ERE clause on th
16670 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61  e outer query ca
16680 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d  nnot be.** optim
16690 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ized..**.** This
166a0 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
166b0 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65  s to rewrite que
166c0 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65  ries such as the
166d0 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61   above into.** a
166e0 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c   single flat sel
166f0 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ect, like this:.
16700 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
16710 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
16720 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e  1 WHERE z<100 AN
16730 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  D a>5.**.** The 
16740 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66  code generated f
16750 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69 63  or this simpific
16760 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20  ation gives the 
16770 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62  same result.** b
16780 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73  ut only has to s
16790 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63  can the data onc
167a0 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20  e.  And because 
167b0 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a  indices might .*
167c0 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74  * exist on the t
167d0 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c  able t1, a compl
167e0 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20  ete scan of the 
167f0 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a  data might be.**
16800 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20   avoided..**.** 
16810 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e  Flattening is on
16820 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20  ly attempted if 
16830 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
16840 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
16850 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20  *.**   (1)  The 
16860 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
16870 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
16880 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67  not both use agg
16890 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
168a0 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65   (2)  The subque
168b0 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
168c0 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75  regate or the ou
168d0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
168e0 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
168f0 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65   (3)  The subque
16900 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69  ry is not the ri
16910 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
16920 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e   left outer join
16930 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67  .**        (Orig
16940 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33  inally ticket #3
16950 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65 6e 65  06.  Strengthene
16960 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 33 30  d by ticket #330
16970 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  0).**.**   (4)  
16980 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
16990 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a  not DISTINCT..**
169a0 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e  .**  (**)  At on
169b0 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74  e point restrict
169c0 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29  ions (4) and (5)
169d0 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65   defined a subse
169e0 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a  t of DISTINCT.**
169f0 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72          sub-quer
16a00 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78  ies that were ex
16a10 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73  cluded from this
16a20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52   optimization. R
16a30 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20  estriction .**  
16a40 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69        (4) has si
16a50 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65  nce been expande
16a60 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c  d to exclude all
16a70 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65   DISTINCT subque
16a80 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36  ries..**.**   (6
16a90 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
16aa0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
16ab0 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
16ac0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
16ad0 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54  t.**        DIST
16ae0 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37  INCT..**.**   (7
16af0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
16b00 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73  has a FROM claus
16b10 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73  e.  TODO:  For s
16b20 75 62 71 75 65 72 69 65 73 20 77 69 74 68 6f 75  ubqueries withou
16b30 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46 52  t.**        A FR
16b40 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69  OM clause, consi
16b50 64 65 72 20 61 64 64 69 6e 67 20 61 20 46 52 4f  der adding a FRO
16b60 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74 68 65  M close with the
16b70 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20   special.**     
16b80 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f     table sqlite_
16b90 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73  once that consis
16ba0 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72  ts of a single r
16bb0 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a  ow containing a.
16bc0 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65  **        single
16bd0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   NULL..**.**   (
16be0 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  8)  The subquery
16bf0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
16c00 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
16c10 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
16c20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
16c30 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
16c40 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
16c50 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
16c60 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
16c70 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
16c80 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
16c90 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65  (10)  The subque
16ca0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
16cb0 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
16cc0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
16cd0 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
16ce0 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
16cf0 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62  *  (11)  The sub
16d00 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
16d10 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
16d20 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
16d30 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
16d40 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d  **  (**)  Not im
16d50 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73  plemented.  Subs
16d60 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69  umed into restri
16d70 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20  ction (3).  Was 
16d80 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20  previously.**   
16d90 20 20 20 20 20 61 20 73 65 70 61 72 61 74 65 20       a separate 
16da0 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69  restriction deri
16db0 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74  ving from ticket
16dc0 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31   #350..**.**  (1
16dd0 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
16de0 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79   and outer query
16df0 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
16e00 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28   LIMIT..**.**  (
16e10 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  14)  The subquer
16e20 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f  y does not use O
16e30 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  FFSET..**.**  (1
16e40 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  5)  The outer qu
16e50 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20  ery is not part 
16e60 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
16e70 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20  lect or the.**  
16e80 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64        subquery d
16e90 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c  oes not have a L
16ea0 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  IMIT clause..** 
16eb0 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b         (See tick
16ec0 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69 63  et #2339 and tic
16ed0 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d  ket [02a8e81d44]
16ee0 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20  )..**.**  (16)  
16ef0 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
16f00 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
16f10 61 74 65 20 6f 72 20 74 68 65 20 73 75 62 71 75  ate or the subqu
16f20 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20  ery does.**     
16f30 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f     not contain O
16f40 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65  RDER BY.  (Ticke
16f50 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75  t #2942)  This u
16f60 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65  sed to not matte
16f70 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69  r.**        unti
16f80 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20  l we introduced 
16f90 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  the group_concat
16fa0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a  () function.  .*
16fb0 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20  *.**  (17)  The 
16fc0 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74  sub-query is not
16fd0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
16fe0 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55  ct, or it is a U
16ff0 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20  NION ALL .**    
17000 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61      compound cla
17010 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69  use made up enti
17020 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72  rely of non-aggr
17030 65 67 61 74 65 20 71 75 65 72 69 65 73 2c 20 61  egate queries, a
17040 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68  nd .**        th
17050 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a  e parent query:.
17060 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  **.**          *
17070 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70   is not itself p
17080 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  art of a compoun
17090 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20  d select,.**    
170a0 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61        * is not a
170b0 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 44  n aggregate or D
170c0 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61  ISTINCT query, a
170d0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  nd.**          *
170e0 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a   is not a join.*
170f0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20  *.**        The 
17100 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71  parent and sub-q
17110 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  uery may contain
17120 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20   WHERE clauses. 
17130 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20  Subject to.**   
17140 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c       rules (11),
17150 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20   (13) and (14), 
17160 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f  they may also co
17170 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a  ntain ORDER BY,.
17180 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20  **        LIMIT 
17190 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73  and OFFSET claus
171a0 65 73 2e 20 20 54 68 65 20 73 75 62 71 75 65 72  es.  The subquer
171b0 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79  y cannot use any
171c0 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
171d0 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68      operator oth
171e0 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c  er than UNION AL
171f0 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68  L because all th
17200 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64  e other compound
17210 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61  .**        opera
17220 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70  tors have an imp
17230 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20 77 68  lied DISTINCT wh
17240 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65  ich is disallowe
17250 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72  d by.**        r
17260 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a  estriction (4)..
17270 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20  **.**  (18)  If 
17280 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
17290 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
172a0 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72  ct, then all ter
172b0 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  ms of the.**    
172c0 20 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61      ORDER by cla
172d0 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e  use of the paren
172e0 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65  t must be simple
172f0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a   references to .
17300 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  **        column
17310 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65  s of the sub-que
17320 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20  ry..**.**  (19) 
17330 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
17340 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
17350 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
17360 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
17370 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57 48         have a WH
17380 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ERE clause..**.*
17390 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65 20  *  (20)  If the 
173a0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
173b0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
173c0 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74  then it must not
173d0 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
173e0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
173f0 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37 33  e.  Ticket #3773
17400 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61  .  We could rela
17410 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  x this constrain
17420 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65  t.**        some
17430 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20 74  what by saying t
17440 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66  hat the terms of
17450 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
17460 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20  ause must.**    
17470 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75 6e      appear as un
17480 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74 20  modified result 
17490 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  columns in the o
174a0 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75 74  uter query.  But
174b0 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61   we.**        ha
174c0 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a  ve other optimiz
174d0 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74  ations in mind t
174e0 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61 74  o deal with that
174f0 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32   case..**.**  (2
17500 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
17510 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
17520 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
17530 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
17540 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
17550 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b  .  (See ticket [
17560 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a  752e1646fc])..**
17570 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
17580 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
17590 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
175a0 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
175b0 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
175c0 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
175d0 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
175e0 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
175f0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
17600 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
17610 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49  es and subqueryI
17620 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
17630 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
17640 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  s aggregates..**
17650 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
17660 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  g is not attempt
17670 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
17680 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20   is a no-op and 
17690 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66  returns 0..** If
176a0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
176b0 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f  ttempted this ro
176c0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
176d0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
176e0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  e expression ana
176f0 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72  lysis must occur
17700 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74   on both the out
17710 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20  er query and.** 
17720 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66  the subquery bef
17730 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
17740 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   runs..*/.static
17750 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71   int flattenSubq
17760 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70  uery(.  Parse *p
17770 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
17780 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
17790 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
177a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
177b0 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72   parent or outer
177c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
177d0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
177e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
177f0 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d  ndex in p->pSrc-
17800 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65  >a[] of the inne
17810 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  r subquery */.  
17820 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20  int isAgg,      
17830 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
17840 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65  outer SELECT use
17850 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
17860 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73  tions */.  int s
17870 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20  ubqueryIsAgg    
17880 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73  /* True if the s
17890 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
178a0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
178b0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
178c0 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43  har *zSavedAuthC
178d0 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
178e0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  >zAuthContext;. 
178f0 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74   Select *pParent
17900 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  ;.  Select *pSub
17910 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
17920 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73  nner query or "s
17930 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65  ubquery" */.  Se
17940 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20  lect *pSub1;    
17950 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
17960 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65  the rightmost se
17970 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72  lect in sub-quer
17980 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
17990 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
179a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
179b0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
179c0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
179d0 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
179e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
179f0 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
17a00 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
17a10 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
17a20 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
17a30 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
17a40 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
17a50 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
17a60 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
17a70 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
17a80 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
17a90 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
17aa0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
17ab0 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nter */.  Expr *
17ac0 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
17ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17ae0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
17af0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
17b00 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65  st_item *pSubite
17b10 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  m;   /* The subq
17b20 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
17b30 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
17b40 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  db;..  /* Check 
17b50 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65  to see if flatte
17b60 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
17b70 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
17b80 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  not..  */.  asse
17b90 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
17ba0 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
17bb0 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65  =0 );  /* Unable
17bc0 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70   to flatten comp
17bd0 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a  ound queries */.
17be0 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
17bf0 26 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c  & SQLITE_QueryFl
17c00 61 74 74 65 6e 65 72 20 29 20 72 65 74 75 72 6e  attener ) return
17c10 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
17c20 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
17c30 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
17c40 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
17c50 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74  nSrc );.  pSubit
17c60 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46  em = &pSrc->a[iF
17c70 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20  rom];.  iParent 
17c80 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72  = pSubitem->iCur
17c90 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53  sor;.  pSub = pS
17ca0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
17cb0 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21  .  assert( pSub!
17cc0 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67  =0 );.  if( isAg
17cd0 67 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41  g && subqueryIsA
17ce0 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  gg ) return 0;  
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17d00 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
17d10 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75 62 71  )  */.  if( subq
17d20 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72  ueryIsAgg && pSr
17d30 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75  c->nSrc>1 ) retu
17d40 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f  rn 0;          /
17d50 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
17d60 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72 63 20  )  */.  pSubSrc 
17d70 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20  = pSub->pSrc;.  
17d80 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20  assert( pSubSrc 
17d90 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f  );.  /* Prior to
17da0 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20   version 3.1.2, 
17db0 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
17dc0 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20  FFSET had to be 
17dd0 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73  simple constants
17de0 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74  ,.  ** not arbit
17df0 72 61 72 79 20 65 78 70 72 65 73 73 73 69 6f 6e  rary expresssion
17e00 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f  s, we allowed so
17e10 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20  me combining of 
17e20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
17e30 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68  .  ** because th
17e40 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70  ey could be comp
17e50 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  uted at compile-
17e60 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20  time.  But when 
17e70 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
17e80 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62  .  ** became arb
17e90 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
17ea0 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63  ns, we were forc
17eb0 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69  ed to add restri
17ec0 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a  ctions (13).  **
17ed0 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20   and (14). */.  
17ee0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
17ef0 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20   && p->pLimit ) 
17f00 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
17f10 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
17f20 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20  ction (13) */.  
17f30 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65  if( pSub->pOffse
17f40 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
17f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f60 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
17f70 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20  ction (14) */.  
17f80 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  if( p->pRightmos
17f90 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69  t && pSub->pLimi
17fa0 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
17fb0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  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 20 20 20 20 20 20 20 20 2f 2a                /*
17fe0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35   Restriction (15
17ff0 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  ) */.  }.  if( p
18000 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  SubSrc->nSrc==0 
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 20 20 20 20 20 20 20 20 20 20                  
18030 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
18040 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 70   (7)  */.  if( p
18050 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
18060 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65  SF_Distinct ) re
18070 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
18080 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
18090 20 28 35 29 20 20 2a 2f 0a 20 20 69 66 28 20 70   (5)  */.  if( p
180a0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28  Sub->pLimit && (
180b0 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  pSrc->nSrc>1 || 
180c0 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72  isAgg) ){.     r
180d0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
180e0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
180f0 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20   (8)(9) */.  }. 
18100 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
18110 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
18120 21 3d 30 20 26 26 20 73 75 62 71 75 65 72 79 49  !=0 && subqueryI
18130 73 41 67 67 20 29 7b 0a 20 20 20 20 20 72 65 74  sAgg ){.     ret
18140 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f  urn 0;         /
18150 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36  * Restriction (6
18160 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  )  */.  }.  if( 
18170 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  p->pOrderBy && p
18180 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
18190 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
181a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
181d0 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f  triction (11) */
181e0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67  .  }.  if( isAgg
181f0 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
18200 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  By ) return 0;  
18210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18220 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36   Restriction (16
18230 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
18240 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57  >pLimit && p->pW
18250 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
18260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18270 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39   Restriction (19
18280 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
18290 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73  >pLimit && (p->s
182a0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
182b0 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20  tinct)!=0 ){.   
182c0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
182d0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
182e0 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 0a  on (21) */.  }..
182f0 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f    /* OBSOLETE CO
18300 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20 52 65  MMENT 1:.  ** Re
18310 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66  striction 3:  If
18320 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
18330 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75   a join, make su
18340 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
18350 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65  is .  ** not use
18360 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20 6f  d as the right o
18370 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74  perand of an out
18380 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c  er join.  Exampl
18390 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  es of why this. 
183a0 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77   ** is not allow
183b0 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
183c0 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
183d0 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49  TER JOIN (t2 JOI
183e0 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  N t3).  **.  ** 
183f0 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
18400 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
18410 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
18420 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
18430 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
18440 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a  JOIN t3.  **.  *
18450 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61  * which is not a
18460 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74  t all the same t
18470 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  hing..  **.  ** 
18480 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54  OBSOLETE COMMENT
18490 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63   2:.  ** Restric
184a0 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65  tion 12:  If the
184b0 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
184c0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
184d0 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20  f a left outer. 
184e0 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73   ** join, make s
184f0 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ure the subquery
18500 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   has no WHERE cl
18510 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78  ause..  ** An ex
18520 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
18530 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  is is not allowe
18540 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
18550 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
18560 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20  ER JOIN (SELECT 
18570 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  * FROM t2 WHERE 
18580 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a  t2.x>0).  **.  *
18590 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
185a0 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
185b0 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
185c0 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
185d0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
185e0 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20  ) WHERE t2.x>0. 
185f0 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65   **.  ** But the
18600 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c   t2.x>0 test wil
18610 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e  l always fail on
18620 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74   a NULL row of t
18630 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66  2, which.  ** ef
18640 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72  fectively conver
18650 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49  ts the OUTER JOI
18660 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20  N into an INNER 
18670 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  JOIN..  **.  ** 
18680 54 48 49 53 20 4f 56 45 52 52 49 44 45 53 20 4f  THIS OVERRIDES O
18690 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 53  BSOLETE COMMENTS
186a0 20 31 20 41 4e 44 20 32 20 41 42 4f 56 45 3a 0a   1 AND 2 ABOVE:.
186b0 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33 33 30    ** Ticket #330
186c0 30 20 73 68 6f 77 73 20 74 68 61 74 20 66 6c 61  0 shows that fla
186d0 74 74 65 6e 69 6e 67 20 74 68 65 20 72 69 67 68  ttening the righ
186e0 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
186f0 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20 66 72   JOIN.  ** is fr
18700 61 75 67 68 74 20 77 69 74 68 20 64 61 6e 67 65  aught with dange
18710 72 2e 20 20 42 65 73 74 20 74 6f 20 61 76 6f 69  r.  Best to avoi
18720 64 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69 6e  d the whole thin
18730 67 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  g.  If the.  ** 
18740 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
18750 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20  right term of a 
18760 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20  LEFT JOIN, then 
18770 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 0a  do not flatten..
18780 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62    */.  if( (pSub
18790 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  item->jointype &
187a0 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b   JT_OUTER)!=0 ){
187b0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
187c0 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63   }..  /* Restric
187d0 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65 20  tion 17: If the 
187e0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
187f0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20  ompound SELECT, 
18800 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a  then it must.  *
18810 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55  * use only the U
18820 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
18830 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74  r. And none of t
18840 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  he simple select
18850 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68   queries.  ** th
18860 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63  at make up the c
18870 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61  ompound SELECT a
18880 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  re allowed to be
18890 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69   aggregate or di
188a0 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72  stinct.  ** quer
188b0 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ies..  */.  if( 
188c0 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  pSub->pPrior ){.
188d0 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
188e0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
188f0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65  return 0;  /* Re
18900 73 74 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a  striction 20 */.
18910 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
18920 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c  Agg || (p->selFl
18930 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
18940 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e  t)!=0 || pSrc->n
18950 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  Src!=1 ){.      
18960 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
18970 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53      for(pSub1=pS
18980 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31  ub; pSub1; pSub1
18990 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b  =pSub1->pPrior){
189a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
189b0 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
189c0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
189d0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
189e0 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a  =SF_Distinct );.
189f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18a00 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
18a10 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
18a20 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
18a30 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a  SF_Aggregate );.
18a40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
18a50 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20  ub->pSrc!=0 );. 
18a60 20 20 20 20 20 69 66 28 20 28 70 53 75 62 31 2d       if( (pSub1-
18a70 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
18a80 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
18a90 65 67 61 74 65 29 29 21 3d 30 0a 20 20 20 20 20  egate))!=0.     
18aa0 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72    || (pSub1->pPr
18ab0 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70  ior && pSub1->op
18ac0 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20  !=TK_ALL) .     
18ad0 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63    || pSub1->pSrc
18ae0 2d 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20 20 29  ->nSrc<1.      )
18af0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
18b00 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
18b10 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62    testcase( pSub
18b20 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  1->pSrc->nSrc>1 
18b30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
18b40 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e   Restriction 18.
18b50 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
18b60 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
18b70 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66   int ii;.      f
18b80 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70  or(ii=0; ii<p->p
18b90 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
18ba0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ii++){.        i
18bb0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  f( p->pOrderBy->
18bc0 61 5b 69 69 5d 2e 69 4f 72 64 65 72 42 79 43 6f  a[ii].iOrderByCo
18bd0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
18be0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18bf0 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20   }..  /***** If 
18c00 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
18c10 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20  int, flattening 
18c20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a  is permitted. **
18c30 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68 6f  ***/..  /* Autho
18c40 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72  rize the subquer
18c50 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a  y */.  pParse->z
18c60 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53  AuthContext = pS
18c70 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  ubitem->zName;. 
18c80 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73   TESTONLY(i =) s
18c90 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
18ca0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
18cb0 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b  ELECT, 0, 0, 0);
18cc0 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d  .  testcase( i==
18cd0 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20  SQLITE_DENY );. 
18ce0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
18cf0 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
18d00 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a  thContext;..  /*
18d10 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
18d20 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
18d30 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
18d40 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72  , then (by restr
18d50 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20  ictions.  ** 17 
18d60 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74  and 18 above) it
18d70 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e   must be a UNION
18d80 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72   ALL and the par
18d90 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a  ent query must .
18da0 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66    ** be of the f
18db0 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  orm:.  **.  **  
18dc0 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d     SELECT <expr-
18dd0 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62  list> FROM (<sub
18de0 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d  -query>) <where-
18df0 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20  clause> .  **.  
18e00 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  ** followed by a
18e10 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
18e20 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54  IT and/or OFFSET
18e30 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62   clauses. This b
18e40 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65  lock.  ** create
18e50 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20  s N-1 copies of 
18e60 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
18e70 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44   without any ORD
18e80 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20  ER BY, LIMIT or 
18e90 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61  .  ** OFFSET cla
18ea0 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74  uses and joins t
18eb0 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  hem to the left-
18ec0 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65  hand-side of the
18ed0 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75   original.  ** u
18ee0 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f  sing UNION ALL o
18ef0 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69  perators. In thi
18f00 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20  s case N is the 
18f10 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65  number of simple
18f20 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61  .  ** select sta
18f30 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63  tements in the c
18f40 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
18f50 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61  y..  **.  ** Exa
18f60 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
18f70 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46      SELECT a+1 F
18f80 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20  ROM (.  **      
18f90 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
18fa0 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
18fb0 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
18fc0 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46        SELECT y F
18fd0 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
18fe0 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
18ff0 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
19000 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74   abs(z*2) FROM t
19010 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57  ab2.  **     ) W
19020 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20  HERE a!=5 ORDER 
19030 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  BY 1.  **.  ** T
19040 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
19050 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
19060 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74  ELECT x+1 FROM t
19070 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a  ab WHERE x+1!=5.
19080 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41    **     UNION A
19090 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  LL.  **     SELE
190a0 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT y+1 FROM tab 
190b0 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a  WHERE y+1!=5.  *
190c0 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
190d0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
190e0 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20  abs(z*2)+1 FROM 
190f0 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a  tab2 WHERE abs(z
19100 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  *2)+1!=5.  **   
19110 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a    ORDER BY 1.  *
19120 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74  *.  ** We call t
19130 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e  his the "compoun
19140 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
19150 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66  ening"..  */.  f
19160 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  or(pSub=pSub->pP
19170 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62  rior; pSub; pSub
19180 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
19190 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77      Select *pNew
191a0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
191b0 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
191c0 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72  rderBy;.    Expr
191d0 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c   *pLimit = p->pL
191e0 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  imit;.    Select
191f0 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50   *pPrior = p->pP
19200 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rior;.    p->pOr
19210 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
19220 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20  ->pSrc = 0;.    
19230 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
19240 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
19250 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
19260 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
19270 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  , p, 0);.    p->
19280 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
19290 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
192a0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
192b0 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b   p->pSrc = pSrc;
192c0 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  .    p->op = TK_
192d0 41 4c 4c 3b 0a 20 20 20 20 70 2d 3e 70 52 69 67  ALL;.    p->pRig
192e0 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20  htmost = 0;.    
192f0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
19300 20 20 20 20 20 70 4e 65 77 20 3d 20 70 50 72 69       pNew = pPri
19310 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  or;.    }else{. 
19320 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f       pNew->pPrio
19330 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
19340 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f    pNew->pRightmo
19350 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  st = 0;.    }.  
19360 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e    p->pPrior = pN
19370 65 77 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  ew;.    if( db->
19380 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
19390 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
193a0 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e  /* Begin flatten
193b0 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68  ing the iFrom-th
193c0 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
193d0 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20  OM clause .  ** 
193e0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
193f0 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20  ry..  */.  pSub 
19400 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62 69 74  = pSub1 = pSubit
19410 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20  em->pSelect;..  
19420 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74 72  /* Delete the tr
19430 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74  ansient table st
19440 72 75 63 74 75 72 65 20 61 73 73 6f 63 69 61 74  ructure associat
19450 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
19460 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20   subquery.  */. 
19470 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
19480 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  b, pSubitem->zDa
19490 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74  tabase);.  sqlit
194a0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
194b0 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  bitem->zName);. 
194c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
194d0 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  b, pSubitem->zAl
194e0 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d  ias);.  pSubitem
194f0 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b  ->zDatabase = 0;
19500 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  .  pSubitem->zNa
19510 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  me = 0;.  pSubit
19520 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a  em->zAlias = 0;.
19530 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c    pSubitem->pSel
19540 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44  ect = 0;..  /* D
19550 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68  efer deleting th
19560 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61  e Table object a
19570 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
19580 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
19590 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65   until code gene
195a0 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  ration is.  ** c
195b0 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74  omplete, since t
195c0 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65  here may still e
195d0 78 69 73 74 20 45 78 70 72 2e 70 54 61 62 20 65  xist Expr.pTab e
195e0 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a  ntries that.  **
195f0 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 73 75   refer to the su
19600 62 71 75 65 72 79 20 65 76 65 6e 20 61 66 74 65  bquery even afte
19610 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54  r flattening.  T
19620 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a  icket #3346..  *
19630 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d  *.  ** pSubitem-
19640 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79 73 20  >pTab is always 
19650 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74  non-NULL by test
19660 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e   restrictions an
19670 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20  d tests above.. 
19680 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
19690 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21  (pSubitem->pTab!
196a0 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  =0) ){.    Table
196b0 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53   *pTabToDel = pS
196c0 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ubitem->pTab;.  
196d0 20 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d    if( pTabToDel-
196e0 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20  >nRef==1 ){.    
196f0 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
19700 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
19710 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
19720 29 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44  );.      pTabToD
19730 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20  el->pNextZombie 
19740 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f  = pToplevel->pZo
19750 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70  mbieTab;.      p
19760 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69  Toplevel->pZombi
19770 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c  eTab = pTabToDel
19780 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19790 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52     pTabToDel->nR
197a0 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef--;.    }.    
197b0 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d  pSubitem->pTab =
197c0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   0;.  }..  /* Th
197d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70  e following loop
197e0 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
197f0 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f  ach term in a co
19800 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a  mpound-subquery.
19810 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20    ** flattening 
19820 28 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62  (as described ab
19830 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61 72 65  ove).  If we are
19840 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65   doing a differe
19850 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20  nt kind.  ** of 
19860 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66  flattening - a f
19870 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20  lattening other 
19880 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d  than a compound-
19890 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e  subquery flatten
198a0 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20  ing -.  ** then 
198b0 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72  this loop only r
198c0 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20  uns once..  **. 
198d0 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f   ** This loop mo
198e0 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46  ves all of the F
198f0 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  ROM elements of 
19900 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
19910 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46  o the.  ** the F
19920 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
19930 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20  e outer query.  
19940 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69  Before doing thi
19950 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a  s, remember.  **
19960 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
19970 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69  er for the origi
19980 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20  nal outer query 
19990 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a  FROM element in.
199a0 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54    ** iParent.  T
199b0 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f  he iParent curso
199c0 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  r will never be 
199d0 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e  used.  Subsequen
199e0 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c  t code.  ** will
199f0 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e   scan expression
19a00 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50  s looking for iP
19a10 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73  arent references
19a20 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a   and replace.  *
19a30 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63  * those referenc
19a40 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69  es with expressi
19a50 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65  ons that resolve
19a60 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79   to the subquery
19a70 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65   FROM.  ** eleme
19a80 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63  nts we are now c
19a90 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a  opying in..  */.
19aa0 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b    for(pParent=p;
19ab0 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e   pParent; pParen
19ac0 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f  t=pParent->pPrio
19ad0 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  r, pSub=pSub->pP
19ae0 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e  rior){.    int n
19af0 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a  SubSrc;.    u8 j
19b00 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20  ointype = 0;.   
19b10 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d   pSubSrc = pSub-
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 73 75 62  OM clause of sub
19b40 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75  query */.    nSu
19b50 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e  bSrc = pSubSrc->
19b60 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72  nSrc;  /* Number
19b70 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62   of terms in sub
19b80 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73  query FROM claus
19b90 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20  e */.    pSrc = 
19ba0 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20  pParent->pSrc;  
19bb0 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
19bc0 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
19bd0 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28  uery */..    if(
19be0 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61   pSrc ){.      a
19bf0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d  ssert( pParent==
19c00 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74  p );  /* First t
19c10 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ime through the 
19c20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f  loop */.      jo
19c30 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74 65  intype = pSubite
19c40 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  m->jointype;.   
19c50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
19c60 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70  sert( pParent!=p
19c70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20   );  /* 2nd and 
19c80 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73  subsequent times
19c90 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f   through the loo
19ca0 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20  p */.      pSrc 
19cb0 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20  = pParent->pSrc 
19cc0 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
19cd0 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c  Append(db, 0, 0,
19ce0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
19cf0 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Src==0 ){.      
19d00 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
19d10 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
19d20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19d30 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
19d40 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
19d50 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c  uses a single sl
19d60 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ot of the FROM c
19d70 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
19d80 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e  er.    ** query.
19d90 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
19da0 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  y has more than 
19db0 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69  one element in i
19dc0 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a  ts FROM clause,.
19dd0 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61      ** then expa
19de0 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
19df0 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65  ry to make space
19e00 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20   for it to hold 
19e10 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20  all elements.   
19e20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75   ** of the subqu
19e30 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ery..    **.    
19e40 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20  ** Example:.    
19e50 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c  **.    **    SEL
19e60 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c  ECT * FROM tabA,
19e70 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
19e80 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62  sub1, sub2), tab
19e90 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  B;.    **.    **
19ea0 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
19eb0 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20   has 3 slots in 
19ec0 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  its FROM clause.
19ed0 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68    One slot of th
19ee0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
19ef0 75 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65  uery (the middle
19f00 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62   slot) is used b
19f10 79 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20  y the subquery. 
19f20 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   The next.    **
19f30 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77   block of code w
19f40 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f  ill expand the o
19f50 75 74 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c  ut query to 4 sl
19f60 6f 74 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65  ots.  The middle
19f70 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20  .    ** slot is 
19f80 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20  expanded to two 
19f90 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74  slots in order t
19fa0 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72  o make space for
19fb0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20   the.    ** two 
19fc0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
19fd0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
19fe0 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20  he subquery..   
19ff0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62   */.    if( nSub
1a000 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  Src>1 ){.      p
1a010 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70  Parent->pSrc = p
1a020 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
1a030 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20  ListEnlarge(db, 
1a040 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c  pSrc, nSubSrc-1,
1a050 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20  iFrom+1);.      
1a060 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1a070 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
1a080 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1a090 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61     }..    /* Tra
1a0a0 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63  nsfer the FROM c
1a0b0 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d  lause terms from
1a0c0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
1a0d0 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  to the.    ** ou
1a0e0 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a  ter query..    *
1a0f0 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
1a100 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a  <nSubSrc; i++){.
1a110 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c        sqlite3IdL
1a120 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  istDelete(db, pS
1a130 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70  rc->a[i+iFrom].p
1a140 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53  Using);.      pS
1a150 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d  rc->a[i+iFrom] =
1a160 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a   pSubSrc->a[i];.
1a170 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53        memset(&pS
1a180 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20  ubSrc->a[i], 0, 
1a190 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e  sizeof(pSubSrc->
1a1a0 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  a[i]));.    }.  
1a1b0 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d    pSrc->a[iFrom]
1a1c0 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e  .jointype = join
1a1d0 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  type;.  .    /* 
1a1e0 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74 69  Now begin substi
1a1f0 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79 20  tuting subquery 
1a200 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65  result set expre
1a210 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20  ssions for .    
1a220 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ** references to
1a230 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20   the iParent in 
1a240 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
1a250 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
1a260 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a  Example:.    **.
1a270 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
1a280 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28  a+5, b*10 FROM (
1a290 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c  SELECT x*3 AS a,
1a2a0 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20   y+10 AS b FROM 
1a2b0 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20  t1) WHERE a>b;. 
1a2c0 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20     **   \       
1a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
1a2e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62  ____________ sub
1a2f0 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
1a300 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20  /          /.   
1a310 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f   **    \________
1a320 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
1a330 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
1a340 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1a350 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a  ________/.    **
1a360 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20  .    ** We look 
1a370 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73  at every express
1a380 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ion in the outer
1a390 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79   query and every
1a3a0 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20   place we see.  
1a3b0 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73    ** "a" we subs
1a3c0 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64  titute "x*3" and
1a3d0 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
1a3e0 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74  see "b" we subst
1a3f0 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20  itute "y+10"..  
1a400 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d    */.    pList =
1a410 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74   pParent->pEList
1a420 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1a430 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
1a440 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1a450 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1a460 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
1a470 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61 6e  onst char *zSpan
1a480 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a   = pList->a[i].z
1a490 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 69 66  Span;.        if
1a4a0 28 20 41 4c 57 41 59 53 28 7a 53 70 61 6e 29 20  ( ALWAYS(zSpan) 
1a4b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 69  ){.          pLi
1a4c0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
1a4d0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
1a4e0 28 64 62 2c 20 7a 53 70 61 6e 29 3b 0a 20 20 20  (db, zSpan);.   
1a4f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1a500 20 20 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78     }.    substEx
1a510 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
1a520 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72  nt->pEList, iPar
1a530 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
1a540 74 29 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67  t);.    if( isAg
1a550 67 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  g ){.      subst
1a560 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61  ExprList(db, pPa
1a570 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20  rent->pGroupBy, 
1a580 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
1a590 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50  EList);.      pP
1a5a0 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
1a5b0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1a5c0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c  Parent->pHaving,
1a5d0 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1a5e0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  pEList);.    }. 
1a5f0 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
1a600 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 61  derBy ){.      a
1a610 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1a620 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
1a630 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f       pParent->pO
1a640 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70  rderBy = pSub->p
1a650 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70  OrderBy;.      p
1a660 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  Sub->pOrderBy = 
1a670 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
1a680 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
1a690 42 79 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73  By ){.      subs
1a6a0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50  tExprList(db, pP
1a6b0 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c  arent->pOrderBy,
1a6c0 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1a6d0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  pEList);.    }. 
1a6e0 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68     if( pSub->pWh
1a6f0 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68  ere ){.      pWh
1a700 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
1a710 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
1a720 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d  Where, 0);.    }
1a730 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65  else{.      pWhe
1a740 72 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  re = 0;.    }.  
1a750 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
1a760 41 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Agg ){.      ass
1a770 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48  ert( pParent->pH
1a780 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20  aving==0 );.    
1a790 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69    pParent->pHavi
1a7a0 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57  ng = pParent->pW
1a7b0 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72  here;.      pPar
1a7c0 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  ent->pWhere = pW
1a7d0 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72  here;.      pPar
1a7e0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
1a7f0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
1a800 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69  rent->pHaving, i
1a810 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1a820 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61  List);.      pPa
1a830 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
1a840 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
1a850 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  b, pParent->pHav
1a860 69 6e 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ing, .          
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a880 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a890 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  xprDup(db, pSub-
1a8a0 3e 70 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20  >pHaving, 0));. 
1a8b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1a8c0 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  rent->pGroupBy==
1a8d0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
1a8e0 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73  nt->pGroupBy = s
1a8f0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
1a900 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f  p(db, pSub->pGro
1a910 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65  upBy, 0);.    }e
1a920 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65  lse{.      pPare
1a930 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62  nt->pWhere = sub
1a940 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
1a950 6e 74 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72  nt->pWhere, iPar
1a960 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
1a970 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  t);.      pParen
1a980 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  t->pWhere = sqli
1a990 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
1a9a0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20  Parent->pWhere, 
1a9b0 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20  pWhere);.    }. 
1a9c0 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61   .    /* The fla
1a9d0 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20  ttened query is 
1a9e0 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68  distinct if eith
1a9f0 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20  er the inner or 
1aa00 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
1aa10 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
1aa20 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ct. .    */.    
1aa30 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67  pParent->selFlag
1aa40 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c  s |= pSub->selFl
1aa50 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1aa60 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20  t;.  .    /*.   
1aa70 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46   ** SELECT ... F
1aa80 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
1aa90 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62  LIMIT a OFFSET b
1aaa0 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54  ) LIMIT x OFFSET
1aab0 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   y;.    **.    *
1aac0 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64  * One is tempted
1aad0 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61   to try to add a
1aae0 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e   and b to combin
1aaf0 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42  e the limits.  B
1ab00 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64  ut this.    ** d
1ab10 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20  oes not work if 
1ab20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20  either limit is 
1ab30 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f  negative..    */
1ab40 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
1ab50 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70  Limit ){.      p
1ab60 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d  Parent->pLimit =
1ab70 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20   pSub->pLimit;. 
1ab80 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69       pSub->pLimi
1ab90 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
1aba0 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c  ..  /* Finially,
1abb0 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20   delete what is 
1abc0 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71  left of the subq
1abd0 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a  uery and return.
1abe0 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20    ** success..  
1abf0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  */.  sqlite3Sele
1ac00 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  ctDelete(db, pSu
1ac10 62 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31  b1);..  return 1
1ac20 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
1ac30 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1ac40 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1ac50 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1ac60 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f  OMIT_VIEW) */../
1ac70 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
1ac80 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1ac90 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
1aca0 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69  rgument to see i
1acb0 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 6d 69 6e  f it.** is a min
1acc0 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
1acd0 79 2e 20 52 65 74 75 72 6e 20 57 48 45 52 45 5f  y. Return WHERE_
1ace0 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57  ORDERBY_MIN or W
1acf0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
1ad00 20 69 66 20 0a 2a 2a 20 69 74 20 69 73 2c 20 6f   if .** it is, o
1ad10 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20 41  r 0 otherwise. A
1ad20 74 20 70 72 65 73 65 6e 74 2c 20 61 20 71 75 65  t present, a que
1ad30 72 79 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ry is considered
1ad40 20 74 6f 20 62 65 0a 2a 2a 20 61 20 6d 69 6e 28   to be.** a min(
1ad50 29 2f 6d 61 78 28 29 20 71 75 65 72 79 20 69 66  )/max() query if
1ad60 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54 68 65  :.**.**   1. The
1ad70 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20 6f  re is a single o
1ad80 62 6a 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f  bject in the FRO
1ad90 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
1ada0 20 20 32 2e 20 54 68 65 72 65 20 69 73 20 61 20    2. There is a 
1adb0 73 69 6e 67 6c 65 20 65 78 70 72 65 73 73 69 6f  single expressio
1adc0 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
1add0 73 65 74 2c 20 61 6e 64 20 69 74 20 69 73 0a 2a  set, and it is.*
1ade0 2a 20 20 20 20 20 20 65 69 74 68 65 72 20 6d 69  *      either mi
1adf0 6e 28 78 29 20 6f 72 20 6d 61 78 28 78 29 2c 20  n(x) or max(x), 
1ae00 77 68 65 72 65 20 78 20 69 73 20 61 20 63 6f 6c  where x is a col
1ae10 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a  umn reference..*
1ae20 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d  /.static u8 minM
1ae30 61 78 51 75 65 72 79 28 53 65 6c 65 63 74 20 2a  axQuery(Select *
1ae40 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  p){.  Expr *pExp
1ae50 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  r;.  ExprList *p
1ae60 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
1ae70 74 3b 0a 0a 20 20 69 66 28 20 70 45 4c 69 73 74  t;..  if( pEList
1ae80 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
1ae90 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
1aea0 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45 78 70  Y_NORMAL;.  pExp
1aeb0 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  r = pEList->a[0]
1aec0 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45  .pExpr;.  if( pE
1aed0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
1aee0 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
1aef0 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  n 0;.  if( NEVER
1af00 28 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  (ExprHasProperty
1af10 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1af20 6c 65 63 74 29 29 20 29 20 72 65 74 75 72 6e 20  lect)) ) return 
1af30 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 45  0;.  pEList = pE
1af40 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
1af50 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c  if( pEList==0 ||
1af60 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
1af70 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
1af80 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  if( pEList->a[0]
1af90 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41  .pExpr->op!=TK_A
1afa0 47 47 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  GG_COLUMN ) retu
1afb0 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  rn WHERE_ORDERBY
1afc0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 61 73 73 65 72  _NORMAL;.  asser
1afd0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1afe0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1aff0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 69 66 28  tValue) );.  if(
1b000 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1b010 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1b020 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "min")==0 ){.   
1b030 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52   return WHERE_OR
1b040 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65 6c  DERBY_MIN;.  }el
1b050 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
1b060 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  rICmp(pExpr->u.z
1b070 54 6f 6b 65 6e 2c 22 6d 61 78 22 29 3d 3d 30 20  Token,"max")==0 
1b080 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 48  ){.    return WH
1b090 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b  ERE_ORDERBY_MAX;
1b0a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 48  .  }.  return WH
1b0b0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
1b0c0 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  AL;.}../*.** The
1b0d0 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
1b0e0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1b0f0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
1b100 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71  s an aggregate q
1b110 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63  uery..** The sec
1b120 6f 6e 64 20 61 72 67 6d 65 6e 74 20 69 73 20 74  ond argment is t
1b130 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67  he associated ag
1b140 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a  gregate-info obj
1b150 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ect. This .** fu
1b160 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20  nction tests if 
1b170 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66  the SELECT is of
1b180 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
1b190 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
1b1a0 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a  *) FROM <tbl>.**
1b1b0 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20  .** where table 
1b1c0 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61  is a database ta
1b1d0 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73  ble, not a sub-s
1b1e0 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49  elect or view. I
1b1f0 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64  f the query.** d
1b200 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70  oes match this p
1b210 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70  attern, then a p
1b220 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61  ointer to the Ta
1b230 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65  ble object repre
1b240 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e  senting.** <tbl>
1b250 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1b260 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65  herwise, 0 is re
1b270 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1b280 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c  c Table *isSimpl
1b290 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70  eCount(Select *p
1b2a0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
1b2b0 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  nfo){.  Table *p
1b2c0 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78  Tab;.  Expr *pEx
1b2d0 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  pr;..  assert( !
1b2e0 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a  p->pGroupBy );..
1b2f0 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
1b300 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  || p->pEList->nE
1b310 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d  xpr!=1 .   || p-
1b320 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c  >pSrc->nSrc!=1 |
1b330 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  | p->pSrc->a[0].
1b340 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20  pSelect.  ){.   
1b350 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1b360 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
1b370 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45  >a[0].pTab;.  pE
1b380 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
1b390 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61  >a[0].pExpr;.  a
1b3a0 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21  ssert( pTab && !
1b3b0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26  pTab->pSelect &&
1b3c0 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28   pExpr );..  if(
1b3d0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
1b3e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1b3f0 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
1b400 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
1b410 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1b420 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d  pAggInfo->nFunc=
1b430 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1b440 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e   if( (pAggInfo->
1b450 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e  aFunc[0].pFunc->
1b460 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e  flags&SQLITE_FUN
1b470 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65  C_COUNT)==0 ) re
1b480 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
1b490 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69  xpr->flags&EP_Di
1b4a0 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
1b4b0 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61  0;..  return pTa
1b4c0 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  b;.}../*.** If t
1b4d0 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69  he source-list i
1b4e0 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e  tem passed as an
1b4f0 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75   argument was au
1b500 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a  gmented with an.
1b510 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  ** INDEXED BY cl
1b520 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74  ause, then try t
1b530 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65  o locate the spe
1b540 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66  cified index. If
1b550 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75   there.** was su
1b560 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20  ch a clause and 
1b570 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
1b580 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c  cannot be found,
1b590 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
1b5a0 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61  TE_ERROR and lea
1b5b0 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70  ve an error in p
1b5c0 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65  Parse. Otherwise
1b5d0 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70  , populate .** p
1b5e0 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64  From->pIndex and
1b5f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b600 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
1b610 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
1b620 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b630 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1b640 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  tem *pFrom){.  i
1b650 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26  f( pFrom->pTab &
1b660 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20  & pFrom->zIndex 
1b670 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
1b680 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
1b690 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64  ;.    char *zInd
1b6a0 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64  ex = pFrom->zInd
1b6b0 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  ex;.    Index *p
1b6c0 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
1b6d0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
1b6e0 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26  .        pIdx &&
1b6f0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1b700 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e  pIdx->zName, zIn
1b710 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20 20 70  dex); .        p
1b720 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a  Idx=pIdx->pNext.
1b730 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
1b740 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71  pIdx ){.      sq
1b750 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1b760 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
1b770 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65  ndex: %s", zInde
1b780 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  x, 0);.      pPa
1b790 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
1b7a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
1b7b0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1b7c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d  .    }.    pFrom
1b7d0 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  ->pIndex = pIdx;
1b7e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1b7f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1b800 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1b810 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62  s a Walker callb
1b820 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69  ack for "expandi
1b830 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ng" a SELECT sta
1b840 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61  tement..** "Expa
1b850 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20  nding" means to 
1b860 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  do the following
1b870 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
1b880 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63  Make sure VDBE c
1b890 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
1b8a0 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
1b8b0 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20   to every.**    
1b8c0 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20       element of 
1b8d0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
1b8e0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46  .**.**    (2)  F
1b8f0 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c  ill in the pTabL
1b900 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69  ist->a[].pTab fi
1b910 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c  elds in the SrcL
1b920 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20  ist that .**    
1b930 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f       defines FRO
1b940 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20  M clause.  When 
1b950 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20  views appear in 
1b960 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  the FROM clause,
1b970 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c  .**         fill
1b980 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
1b990 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  Select with a co
1b9a0 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
1b9b0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
1b9c0 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65        that imple
1b9d0 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20  ments the view. 
1b9e0 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
1b9f0 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45  of the view's SE
1ba00 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
1ba10 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61  statement so tha
1ba20 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20  t we can freely 
1ba30 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65  modify or delete
1ba40 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a   that statement.
1ba50 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f  **         witho
1ba60 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75  ut worrying abou
1ba70 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65  t messing up the
1ba80 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70 72   presistent repr
1ba90 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20  esentation.**   
1baa0 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65        of the vie
1bab0 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20  w..**.**    (3) 
1bac0 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68   Add terms to th
1bad0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
1bae0 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65  o accomodate the
1baf0 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
1bb00 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
1bb10 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
1bb20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
1bb30 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
1bb40 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68      (4)  Scan th
1bb50 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
1bb60 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
1bb70 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
1bb80 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
1bb90 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
1bba0 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
1bbb0 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
1bbc0 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
1bbd0 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
1bbe0 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
1bbf0 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
1bc00 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
1bc10 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
1bc20 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
1bc30 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
1bc40 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  ABLE..**.*/.stat
1bc50 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70  ic int selectExp
1bc60 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57  ander(Walker *pW
1bc70 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
1bc80 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
1bc90 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
1bca0 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  arse;.  int i, j
1bcb0 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  , k;.  SrcList *
1bcc0 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
1bcd0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
1bce0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1bcf0 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71  tem *pFrom;.  sq
1bd00 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1bd10 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 64  se->db;..  if( d
1bd20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1bd30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
1bd40 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  RC_Abort;.  }.  
1bd50 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53 72  if( NEVER(p->pSr
1bd60 63 3d 3d 30 29 20 7c 7c 20 28 70 2d 3e 73 65 6c  c==0) || (p->sel
1bd70 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e  Flags & SF_Expan
1bd80 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ded)!=0 ){.    r
1bd90 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
1bda0 0a 20 20 7d 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  .  }.  p->selFla
1bdb0 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65  gs |= SF_Expande
1bdc0 64 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  d;.  pTabList = 
1bdd0 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
1bde0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a  t = p->pEList;..
1bdf0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63    /* Make sure c
1be00 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
1be10 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
1be20 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   to all entries 
1be30 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  in.  ** the FROM
1be40 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53   clause of the S
1be50 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1be60 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
1be70 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
1be80 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  ors(pParse, pTab
1be90 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  List);..  /* Loo
1bea0 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
1beb0 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
1bec0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1bed0 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a   select.  If.  *
1bee0 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  * an entry of th
1bef0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
1bf00 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74   a subquery inst
1bf10 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ead of a table o
1bf20 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65  r view,.  ** the
1bf30 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73  n create a trans
1bf40 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
1bf50 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65  ture to describe
1bf60 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
1bf70 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
1bf80 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
1bf90 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
1bfa0 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
1bfb0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
1bfc0 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  ab;.    if( pFro
1bfd0 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20  m->pTab!=0 ){.  
1bfe0 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74      /* This stat
1bff0 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64  ement has alread
1c000 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e  y been prepared.
1c010 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
1c020 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67  ed.      ** to g
1c030 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20  o further. */.  
1c040 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30      assert( i==0
1c050 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1c060 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
1c070 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  }.    if( pFrom-
1c080 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
1c090 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c0a0 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
1c0b0 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
1c0c0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
1c0d0 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
1c0e0 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
1c0f0 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
1c100 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
1c110 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20  rt( pSel!=0 );. 
1c120 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
1c130 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
1c140 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
1c150 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
1c160 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 70 46 72  pSel);.      pFr
1c170 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
1c180 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1c190 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
1c1a0 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20  (Table));.      
1c1b0 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
1c1c0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
1c1d0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
1c1e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61 62   = 1;.      pTab
1c1f0 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
1c200 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71  3MPrintf(db, "sq
1c210 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25 70  lite_subquery_%p
1c220 5f 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29  _", (void*)pTab)
1c230 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
1c240 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70  Sel->pPrior ){ p
1c250 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
1c260 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c 65  or; }.      sele
1c270 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
1c280 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
1c290 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61  el->pEList, &pTa
1c2a0 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
1c2b0 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61  aCol);.      pTa
1c2c0 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
1c2d0 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45       pTab->nRowE
1c2e0 73 74 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20  st = 1000000;.  
1c2f0 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
1c300 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72  gs |= TF_Ephemer
1c310 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  al;.#endif.    }
1c320 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
1c330 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  n ordinary table
1c340 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e   or view name in
1c350 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1c360 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1c370 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
1c380 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d   );.      pFrom-
1c390 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a  >pTab = pTab = .
1c3a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
1c3b0 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
1c3c0 65 2c 30 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  e,0,pFrom->zName
1c3d0 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73  ,pFrom->zDatabas
1c3e0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  e);.      if( pT
1c3f0 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
1c400 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
1c410 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69  pTab->nRef++;.#i
1c420 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1c430 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
1c440 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45  !defined (SQLITE
1c450 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1c460 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 70 54  LE).      if( pT
1c470 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49  ab->pSelect || I
1c480 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
1c490 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
1c4a0 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68  reach here if th
1c4b0 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
1c4c0 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77   a really a view
1c4d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1c4e0 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
1c4f0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
1c500 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  , pTab) ) return
1c510 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
1c520 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
1c530 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  m->pSelect==0 );
1c540 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
1c550 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
1c560 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
1c570 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  Tab->pSelect, 0)
1c580 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1c590 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
1c5a0 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ker, pFrom->pSel
1c5b0 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ect);.      }.#e
1c5c0 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
1c5d0 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  /* Locate the in
1c5e0 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65  dex named by the
1c5f0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
1c600 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  se, if any. */. 
1c610 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e     if( sqlite3In
1c620 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50  dexedByLookup(pP
1c630 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a  arse, pFrom) ){.
1c640 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
1c650 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
1c660 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
1c670 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73  NATURAL keywords
1c680 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49  , and ON and USI
1c690 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f  NG clauses of jo
1c6a0 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
1c6b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c6c0 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73   || sqliteProces
1c6d0 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29  sJoin(pParse, p)
1c6e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
1c6f0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
1c700 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a   /* For every "*
1c710 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  " that occurs in
1c720 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
1c730 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  , insert the nam
1c740 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63  es of.  ** all c
1c750 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
1c760 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65  bles.  And for e
1c770 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73  very TABLE.* ins
1c780 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20  ert the names.  
1c790 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  ** of all column
1c7a0 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65  s in TABLE.  The
1c7b0 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64   parser inserted
1c7c0 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65   a special expre
1c7d0 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20  ssion.  ** with 
1c7e0 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61  the TK_ALL opera
1c7f0 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22  tor for each "*"
1c800 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69   that it found i
1c810 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
1c820 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  t..  ** The foll
1c830 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20  owing code just 
1c840 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  has to locate th
1c850 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73  e TK_ALL express
1c860 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a  ions and expand.
1c870 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f    ** each one to
1c880 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
1c890 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
1c8a0 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
1c8b0 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  * The first loop
1c8c0 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20   just checks to 
1c8d0 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
1c8e0 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f   any "*" operato
1c8f0 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65  rs.  ** that nee
1c900 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a  d expanding..  *
1c910 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70  /.  for(k=0; k<p
1c920 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
1c930 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
1c940 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e   = pEList->a[k].
1c950 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
1c960 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20  E->op==TK_ALL ) 
1c970 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72  break;.    asser
1c980 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
1c990 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21  T || pE->pRight!
1c9a0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1c9b0 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
1c9c0 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d   || (pE->pLeft!=
1c9d0 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  0 && pE->pLeft->
1c9e0 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20  op==TK_ID) );.  
1c9f0 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
1ca00 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67  _DOT && pE->pRig
1ca10 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  ht->op==TK_ALL )
1ca20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
1ca30 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ( k<pEList->nExp
1ca40 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  r ){.    /*.    
1ca50 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72  ** If we get her
1ca60 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72  e it means the r
1ca70 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69  esult set contai
1ca80 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22  ns one or more "
1ca90 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  *".    ** operat
1caa0 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
1cab0 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c   be expanded.  L
1cac0 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
1cad0 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
1cae0 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
1caf0 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20   set and expand 
1cb00 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  them one by one.
1cb10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75  .    */.    stru
1cb20 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1cb30 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b   *a = pEList->a;
1cb40 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1cb50 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  New = 0;.    int
1cb60 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d   flags = pParse-
1cb70 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  >db->flags;.    
1cb80 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20  int longNames = 
1cb90 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1cba0 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
1cbb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cbc0 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73         && (flags
1cbd0 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
1cbe0 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20  olNames)==0;..  
1cbf0 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
1cc00 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
1cc10 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
1cc20 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20   = a[k].pExpr;. 
1cc30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
1cc40 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
1cc50 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  E->pRight!=0 );.
1cc60 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
1cc70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d  !=TK_ALL && (pE-
1cc80 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
1cc90 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54  E->pRight->op!=T
1cca0 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  K_ALL) ){.      
1ccb0 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63    /* This partic
1ccc0 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ular expression 
1ccd0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
1cce0 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20   be expanded..  
1ccf0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1cd00 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
1cd10 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
1cd20 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d  arse, pNew, a[k]
1cd30 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
1cd40 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
1cd50 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
1cd60 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  New->nExpr-1].zN
1cd70 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65  ame = a[k].zName
1cd80 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
1cd90 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
1cda0 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e  1].zSpan = a[k].
1cdb0 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20  zSpan;.         
1cdc0 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b   a[k].zName = 0;
1cdd0 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  .          a[k].
1cde0 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20  zSpan = 0;.     
1cdf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b     }.        a[k
1ce00 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  ].pExpr = 0;.   
1ce10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ce20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73    /* This expres
1ce30 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72  sion is a "*" or
1ce40 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64   a "TABLE.*" and
1ce50 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
1ce60 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64       ** expanded
1ce70 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
1ce80 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20   tableSeen = 0; 
1ce90 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
1cea0 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63   when TABLE matc
1ceb0 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  hes */.        c
1cec0 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20  har *zTName;    
1ced0 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20          /* text 
1cee0 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
1cef0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1cf00 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pE->op==TK_DOT )
1cf10 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
1cf20 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30  rt( pE->pLeft!=0
1cf30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
1cf40 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1cf50 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74  operty(pE->pLeft
1cf60 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1cf70 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  ;.          zTNa
1cf80 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  me = pE->pLeft->
1cf90 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
1cfa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1cfb0 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20     zTName = 0;. 
1cfc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1cfd0 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
1cfe0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
1cff0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
1d000 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
1d010 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
1d020 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
1d030 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  b;.          cha
1d040 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46  r *zTabName = pF
1d050 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  rom->zAlias;.   
1d060 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
1d070 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
1d080 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d        zTabName =
1d090 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
1d0a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d0b0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
1d0c0 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b  ocFailed ) break
1d0d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1d0e0 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65  zTName && sqlite
1d0f0 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c  3StrICmp(zTName,
1d100 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b   zTabName)!=0 ){
1d110 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
1d120 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1d130 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61 62   }.          tab
1d140 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  leSeen = 1;.    
1d150 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
1d160 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
1d170 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  ){.            E
1d180 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 52 69  xpr *pExpr, *pRi
1d190 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
1d1a0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
1d1b0 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
1d1c0 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
1d1d0 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20  char *zColname; 
1d1e0 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64   /* The computed
1d1f0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   column name */.
1d200 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
1d210 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20   *zToFree;   /* 
1d220 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20  Malloced string 
1d230 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
1d240 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20   freed */.      
1d250 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c        Token sCol
1d260 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74  name;  /* Comput
1d270 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61  ed column name a
1d280 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20  s a token */..  
1d290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1d2a0 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b  a column is mark
1d2b0 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 20 28  ed as 'hidden' (
1d2c0 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70  currently only p
1d2d0 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20  ossible.        
1d2e0 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75      ** for virtu
1d2f0 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e  al tables), do n
1d300 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e  ot include it in
1d310 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20   the expanded.  
1d320 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73            ** res
1d330 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20  ult-set list..  
1d340 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1d350 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48           if( IsH
1d360 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61  iddenColumn(&pTa
1d370 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20  b->aCol[j]) ){. 
1d380 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
1d390 65 72 74 28 49 73 56 69 72 74 75 61 6c 28 70 54  ert(IsVirtual(pT
1d3a0 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ab));.          
1d3b0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1d3c0 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
1d3d0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
1d3e0 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b   && zTName==0 ){
1d3f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1d400 66 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74  f( (pFrom->joint
1d410 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
1d420 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
1d430 20 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64       && tableAnd
1d440 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62  ColumnIndex(pTab
1d450 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  List, i, zName, 
1d460 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20 20  0, 0).          
1d470 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
1d480 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e         /* In a N
1d490 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69  ATURAL join, omi
1d4a0 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d  t the join colum
1d4b0 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  ns from the .   
1d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1d4d0 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67  table to the rig
1d4e0 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ht of the join *
1d4f0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1d500 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1d510 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d520 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
1d530 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
1d540 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20  (pFrom->pUsing, 
1d550 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
1d560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d570 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61  In a join with a
1d580 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f   USING clause, o
1d590 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  mit columns in t
1d5a0 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
1d5b0 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75     ** using clau
1d5c0 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  se from the tabl
1d5d0 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  e on the right. 
1d5e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1d5f0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1d600 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1d610 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d620 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
1d630 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
1d640 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20  TK_ID, zName);. 
1d650 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e             zColn
1d660 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
1d670 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65           zToFree
1d680 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1d690 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
1d6a0 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  || pTabList->nSr
1d6b0 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>1 ){.         
1d6c0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
1d6d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d6e0 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
1d6f0 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
1d700 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TabName);.      
1d710 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
1d720 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
1d730 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65  rse, TK_DOT, pLe
1d740 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a  ft, pRight, 0);.
1d750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1d760 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20  ( longNames ){. 
1d770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
1d780 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  Colname = sqlite
1d790 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
1d7a0 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  .%s", zTabName, 
1d7b0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
1d7c0 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
1d7d0 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20  = zColname;.    
1d7e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d7f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1d800 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1d810 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  pr = pRight;.   
1d820 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d830 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
1d840 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
1d850 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
1d860 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
1d870 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a        sColname.z
1d880 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20   = zColname;.   
1d890 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d           sColnam
1d8a0 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  e.n = sqlite3Str
1d8b0 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b  len30(zColname);
1d8c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1d8d0 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
1d8e0 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77  ame(pParse, pNew
1d8f0 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b  , &sColname, 0);
1d900 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1d910 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1d920 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20  ToFree);.       
1d930 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1d940 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
1d950 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
1d960 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
1d970 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1d980 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1d990 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
1d9a0 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
1d9b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1d9c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1d9d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1d9e0 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
1d9f0 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
1da00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1da10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1da20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
1da30 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
1da40 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
1da50 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
1da60 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
1da70 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28  MAX_COLUMN.  if(
1da80 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d   p->pEList && p-
1da90 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64  >pEList->nExpr>d
1daa0 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
1dab0 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29  _LIMIT_COLUMN] )
1dac0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1dad0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
1dae0 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
1daf0 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b  in result set");
1db00 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
1db10 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
1db20 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f  e;.}../*.** No-o
1db30 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68  p routine for th
1db40 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c  e parse-tree wal
1db50 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ker..**.** When 
1db60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1db70 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  the Walker.xExpr
1db80 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78  Callback then ex
1db90 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a  pression trees.*
1dba0 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74  * are walked wit
1dbb0 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73  hout any actions
1dbc0 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20   being taken at 
1dbd0 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73  each node.  Pres
1dbe0 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20  umably,.** when 
1dbf0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1dc00 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e  used for Walker.
1dc10 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68  xExprCallback th
1dc20 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53  en .** Walker.xS
1dc30 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73  electCallback is
1dc40 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74   set to do somet
1dc50 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20  hing useful for 
1dc60 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65  every .** subque
1dc70 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  ry in the parser
1dc80 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   tree..*/.static
1dc90 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f   int exprWalkNoo
1dca0 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65  p(Walker *NotUse
1dcb0 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64  d, Expr *NotUsed
1dcc0 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
1dcd0 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
1dce0 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
1dcf0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
1dd00 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
1dd10 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64   routine "expand
1dd20 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  s" a SELECT stat
1dd30 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66  ement and all of
1dd40 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73 2e   its subqueries.
1dd50 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e  .** For addition
1dd60 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  al information o
1dd70 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20  n what it means 
1dd80 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53 45  to "expand" a SE
1dd90 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  LECT.** statemen
1dda0 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65  t, see the comme
1ddb0 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74  nt on the select
1ddc0 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61  Expand worker ca
1ddd0 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a  llback above..**
1dde0 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20  .** Expanding a 
1ddf0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1de00 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73 74   is the first st
1de10 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  ep in processing
1de20 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
1de30 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c  tement.  The SEL
1de40 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75  ECT statement mu
1de50 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62  st be expanded b
1de60 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65  efore.** name re
1de70 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66  solution is perf
1de80 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormed..**.** If 
1de90 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
1dea0 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65  ong, an error me
1deb0 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e  ssage is written
1dec0 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a   into pParse..**
1ded0 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
1dee0 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74  ction can detect
1def0 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20   the problem by 
1df00 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73  looking at pPars
1df10 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f  e->nErr.** and/o
1df20 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  r pParse->db->ma
1df30 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73  llocFailed..*/.s
1df40 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
1df50 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50  e3SelectExpand(P
1df60 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
1df70 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
1df80 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
1df90 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1dfa0 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  = selectExpander
1dfb0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
1dfc0 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f  ack = exprWalkNo
1dfd0 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
1dfe0 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74   pParse;.  sqlit
1dff0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
1e000 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23   pSelect);.}...#
1e010 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e020 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
1e030 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b  * This is a Walk
1e040 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
1e050 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ck callback for 
1e060 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63  the sqlite3Selec
1e070 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69  tTypeInfo().** i
1e080 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  nterface..**.** 
1e090 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c  For each FROM-cl
1e0a0 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61  ause subquery, a
1e0b0 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20  dd Column.zType 
1e0c0 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c  and Column.zColl
1e0d0 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
1e0e0 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  to the Table str
1e0f0 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
1e100 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
1e110 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74  t set.** of that
1e120 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a   subquery..**.**
1e130 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
1e140 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73  ture that repres
1e150 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20  ents the result 
1e160 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63  set was construc
1e170 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74  ted.** by select
1e180 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74  Expander() but t
1e190 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  he type and coll
1e1a0 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ation informatio
1e1b0 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a  n was omitted.**
1e1c0 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62   at that point b
1e1d0 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65  ecause identifie
1e1e0 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62  rs had not yet b
1e1f0 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54  een resolved.  T
1e200 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
1e210 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69  s called after i
1e220 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75  dentifier resolu
1e230 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1e240 69 6e 74 20 73 65 6c 65 63 74 41 64 64 53 75 62  int selectAddSub
1e250 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61  queryTypeInfo(Wa
1e260 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
1e270 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
1e280 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e  se *pParse;.  in
1e290 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  t i;.  SrcList *
1e2a0 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
1e2b0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1e2c0 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72  *pFrom;..  asser
1e2d0 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
1e2e0 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a   SF_Resolved );.
1e2f0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
1e300 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
1e310 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  nfo)==0 ){.    p
1e320 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
1e330 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20  _HasTypeInfo;.  
1e340 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
1e350 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  er->pParse;.    
1e360 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
1e370 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  rc;.    for(i=0,
1e380 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
1e390 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
1e3a0 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
1e3b0 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  ++){.      Table
1e3c0 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
1e3d0 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
1e3e0 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30 29 20  ALWAYS(pTab!=0) 
1e3f0 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  && (pTab->tabFla
1e400 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
1e410 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)!=0 ){.       
1e420 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
1e430 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1e440 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
1e450 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  /.        Select
1e460 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
1e470 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
1e480 20 61 73 73 65 72 74 28 20 70 53 65 6c 20 29 3b   assert( pSel );
1e490 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
1e4a0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70  pSel->pPrior ) p
1e4b0 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
1e4c0 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65  or;.        sele
1e4d0 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
1e4e0 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72  ndCollation(pPar
1e4f0 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  se, pTab->nCol, 
1e500 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c  pTab->aCol, pSel
1e510 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1e520 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
1e530 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23 65  C_Continue;.}.#e
1e540 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ndif.../*.** Thi
1e550 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64  s routine adds d
1e560 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  atatype and coll
1e570 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
1e580 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a  nformation to.**
1e590 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
1e5a0 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f  tures of all FRO
1e5b0 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
1e5c0 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45  ies in a.** SELE
1e5d0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
1e5e0 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75  .** Use this rou
1e5f0 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20  tine after name 
1e600 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73  resolution..*/.s
1e610 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
1e620 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49  e3SelectAddTypeI
1e630 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
1e640 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
1e650 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ct){.#ifndef SQL
1e660 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1e670 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  Y.  Walker w;.  
1e680 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
1e690 6b 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62  k = selectAddSub
1e6a0 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20  queryTypeInfo;. 
1e6b0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
1e6c0 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b   = exprWalkNoop;
1e6d0 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
1e6e0 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
1e6f0 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
1e700 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d  elect);.#endif.}
1e710 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
1e720 75 74 69 6e 65 20 73 65 74 73 20 6f 66 20 61 20  utine sets of a 
1e730 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1e740 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e   for processing.
1e750 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69    The.** followi
1e760 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68  ng is accomplish
1e770 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  ed:.**.**     * 
1e780 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d   VDBE Cursor num
1e790 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e 65  bers are assigne
1e7a0 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  d to all FROM-cl
1e7b0 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20  ause terms..**  
1e7c0 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20     *  Ephemeral 
1e7d0 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72  Table objects ar
1e7e0 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
1e7f0 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
1e800 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20  bqueries..**    
1e810 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47   *  ON and USING
1e820 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68 69   clauses are shi
1e830 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20  fted into WHERE 
1e840 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20  statements.**   
1e850 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22    *  Wildcards "
1e860 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22  *" and "TABLE.*"
1e870 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20   in result sets 
1e880 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a  are expanded..**
1e890 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69       *  Identifi
1e8a0 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  ers in expressio
1e8b0 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f  n are matched to
1e8c0 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   tables..**.** T
1e8d0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
1e8e0 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20   recursively on 
1e8f0 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20 77  all subqueries w
1e900 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ithin the SELECT
1e910 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1e920 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50  3SelectPrep(.  P
1e930 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1e940 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1e950 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
1e960 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
1e970 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
1e980 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1e990 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
1e9a0 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
1e9b0 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65  OuterNC  /* Name
1e9c0 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e   context for con
1e9d0 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73  tainer */.){.  s
1e9e0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
1e9f0 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
1ea00 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
1ea10 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
1ea20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
1ea30 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20  F_HasTypeInfo ) 
1ea40 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
1ea50 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50  3SelectExpand(pP
1ea60 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20  arse, p);.  if( 
1ea70 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
1ea80 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1ea90 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
1eaa0 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63  ite3ResolveSelec
1eab0 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  tNames(pParse, p
1eac0 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69  , pOuterNC);.  i
1ead0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1eae0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1eaf0 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
1eb00 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
1eb10 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c  TypeInfo(pParse,
1eb20 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
1eb30 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
1eb40 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  e accumulator..*
1eb50 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61  *.** The aggrega
1eb60 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69  te accumulator i
1eb70 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72  s a set of memor
1eb80 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c  y cells that hol
1eb90 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74  d.** intermediat
1eba0 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20  e results while 
1ebb0 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61  calculating an a
1ebc0 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a  ggregate.  This.
1ebd0 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c  ** routine simpl
1ebe0 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69  y stores NULLs i
1ebf0 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d  n all of those m
1ec00 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  emory cells..*/.
1ec10 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65  static void rese
1ec20 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  tAccumulator(Par
1ec30 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
1ec40 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
1ec50 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1ec60 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1ec70 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
1ec80 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63  Info_func *pFunc
1ec90 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f  ;.  if( pAggInfo
1eca0 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f  ->nFunc+pAggInfo
1ecb0 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a  ->nColumn==0 ){.
1ecc0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1ecd0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
1ece0 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  gInfo->nColumn; 
1ecf0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1ed00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ed10 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49  P_Null, 0, pAggI
1ed20 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
1ed30 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46  m);.  }.  for(pF
1ed40 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46  unc=pAggInfo->aF
1ed50 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67  unc, i=0; i<pAgg
1ed60 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
1ed70 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20  , pFunc++){.    
1ed80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ed90 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1eda0 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20   pFunc->iMem);. 
1edb0 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44     if( pFunc->iD
1edc0 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
1edd0 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
1ede0 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Func->pExpr;.   
1edf0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1ee00 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
1ee10 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1ee20 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78  .      if( pE->x
1ee30 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  .pList==0 || pE-
1ee40 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  >x.pList->nExpr!
1ee50 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
1ee60 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1ee70 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20  arse, "DISTINCT 
1ee80 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20  aggregates must 
1ee90 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
1eea0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
1eeb0 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20  rgument");.     
1eec0 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69     pFunc->iDisti
1eed0 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
1eee0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b  }else{.        K
1eef0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1ef00 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
1ef10 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
1ef20 45 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  E->x.pList);.   
1ef30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ef40 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
1ef50 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e  nEphemeral, pFun
1ef60 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c  c->iDistinct, 0,
1ef70 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1ef90 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
1efa0 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
1efb0 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  F);.      }.    
1efc0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
1efd0 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67  nvoke the OP_Agg
1efe0 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20  Finalize opcode 
1eff0 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67  for every aggreg
1f000 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
1f010 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  in the AggInfo s
1f020 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
1f030 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a  tic void finaliz
1f040 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61  eAggFunctions(Pa
1f050 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
1f060 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
1f070 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1f080 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1f090 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
1f0a0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
1f0b0 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
1f0c0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
1f0d0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
1f0e0 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
1f0f0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1f100 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
1f110 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
1f120 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1f130 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
1f140 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1f150 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1f160 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67  AddOp4(v, OP_Agg
1f170 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c  Final, pF->iMem,
1f180 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
1f190 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20  nExpr : 0, 0,.  
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1b0 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70      (void*)pF->p
1f1c0 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
1f1d0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1f1e0 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d  Update the accum
1f1f0 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65  ulator memory ce
1f200 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65  lls for an aggre
1f210 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  gate based on.**
1f220 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
1f230 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
1f240 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64  .static void upd
1f250 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  ateAccumulator(P
1f260 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
1f270 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
1f280 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1f290 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1f2a0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48  nt i;.  int regH
1f2b0 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64  it = 0;.  int ad
1f2c0 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20  drHitTest = 0;. 
1f2d0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
1f2e0 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75  func *pF;.  stru
1f2f0 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
1f300 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d  pC;..  pAggInfo-
1f310 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  >directMode = 1;
1f320 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
1f330 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
1f340 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
1f350 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
1f360 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
1f370 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
1f380 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
1f390 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d    int addrNext =
1f3a0 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41   0;.    int regA
1f3b0 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  gg;.    ExprList
1f3c0 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
1f3d0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
1f3e0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1f3f0 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
1f400 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1f410 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ct) );.    if( p
1f420 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41  List ){.      nA
1f430 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rg = pList->nExp
1f440 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  r;.      regAgg 
1f450 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1f460 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41  Range(pParse, nA
1f470 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rg);.      sqlit
1f480 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
1f490 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
1f4a0 2c 20 72 65 67 41 67 67 2c 20 31 29 3b 0a 20 20  , regAgg, 1);.  
1f4b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
1f4c0 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Arg = 0;.      r
1f4d0 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d  egAgg = 0;.    }
1f4e0 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69  .    if( pF->iDi
1f4f0 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
1f500 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71     addrNext = sq
1f510 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1f520 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73  el(v);.      ass
1f530 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a  ert( nArg==1 );.
1f540 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e        codeDistin
1f550 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69  ct(pParse, pF->i
1f560 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65  Distinct, addrNe
1f570 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a  xt, 1, regAgg);.
1f580 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
1f590 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67 73 20 26  ->pFunc->flags &
1f5a0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
1f5b0 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43  DCOLL ){.      C
1f5c0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
1f5d0 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  0;.      struct 
1f5e0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1f5f0 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Item;.      int 
1f600 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  j;.      assert(
1f610 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a   pList!=0 );  /*
1f620 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d   pList!=0 if pF-
1f630 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43  >pFunc has NEEDC
1f640 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  OLL */.      for
1f650 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (j=0, pItem=pLis
1f660 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20  t->a; !pColl && 
1f670 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74  j<nArg; j++, pIt
1f680 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
1f690 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1f6a0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1f6b0 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
1f6c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1f6d0 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
1f6e0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61       pColl = pPa
1f6f0 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
1f700 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
1f710 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20    if( regHit==0 
1f720 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63  && pAggInfo->nAc
1f730 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48  cumulator ) regH
1f740 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
1f750 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
1f760 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1f770 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48  OP_CollSeq, regH
1f780 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20  it, 0, 0, (char 
1f790 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
1f7a0 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  SEQ);.    }.    
1f7b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f7c0 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c  4(v, OP_AggStep,
1f7d0 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e   0, regAgg, pF->
1f7e0 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  iMem,.          
1f7f0 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
1f800 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  d*)pF->pFunc, P4
1f810 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73  _FUNCDEF);.    s
1f820 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1f830 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b  P5(v, (u8)nArg);
1f840 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1f850 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
1f860 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
1f870 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73  gg, nArg);.    s
1f880 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1f890 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
1f8a0 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20  egAgg, nArg);.  
1f8b0 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29    if( addrNext )
1f8c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1f8d0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1f8e0 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20  v, addrNext);.  
1f8f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1f900 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
1f910 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1f920 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61  /* Before popula
1f930 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c  ting the accumul
1f940 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20  ator registers, 
1f950 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  clear the column
1f960 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68   cache..  ** Oth
1f970 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f  erwise, if any o
1f980 66 20 74 68 65 20 72 65 71 75 69 72 65 64 20 63  f the required c
1f990 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65  olumn values are
1f9a0 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
1f9b0 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74   .  ** in regist
1f9c0 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72  ers, sqlite3Expr
1f9d0 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f  Code() may use O
1f9e0 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20  P_SCopy to copy 
1f9f0 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74  the value.  ** t
1fa00 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20  o pC->iMem. But 
1fa10 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20  by the time the 
1fa20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74  value is used, t
1fa30 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69  he original regi
1fa40 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61  ster.  ** may ha
1fa50 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e  ve been used, in
1fa60 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75  validating the u
1fa70 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72  nderlying buffer
1fa80 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a   holding the.  *
1fa90 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76  * text or blob v
1faa0 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74  alue. See ticket
1fab0 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20   [883034dcb5].. 
1fac0 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72   **.  ** Another
1fad0 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20   solution would 
1fae0 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  be to change the
1faf0 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74   OP_SCopy used t
1fb00 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20  o copy cached.  
1fb10 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20  ** values to an 
1fb20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20  OP_Copy..  */.  
1fb30 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20  if( regHit ){.  
1fb40 20 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20    addrHitTest = 
1fb50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fb60 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48  1(v, OP_If, regH
1fb70 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  it);.  }.  sqlit
1fb80 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
1fb90 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28  (pParse);.  for(
1fba0 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f  i=0, pC=pAggInfo
1fbb0 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e  ->aCol; i<pAggIn
1fbc0 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
1fbd0 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20  ; i++, pC++){.  
1fbe0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1fbf0 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45  e(pParse, pC->pE
1fc00 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a  xpr, pC->iMem);.
1fc10 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e    }.  pAggInfo->
1fc20 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a  directMode = 0;.
1fc30 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1fc40 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
1fc50 0a 20 20 69 66 28 20 61 64 64 72 48 69 74 54 65  .  if( addrHitTe
1fc60 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  st ){.    sqlite
1fc70 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1fc80 20 61 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20   addrHitTest);. 
1fc90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
1fca0 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c  a single OP_Expl
1fcb0 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ain instruction 
1fcc0 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20 65  to the VDBE to e
1fcd0 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a  xplain a simple.
1fce0 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72  ** count(*) quer
1fcf0 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  y ("SELECT count
1fd00 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e  (*) FROM pTab").
1fd10 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1fd20 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
1fd30 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
1fd40 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a  ainSimpleCount(.
1fd50 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd70 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
1fd80 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
1fd90 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
1fda0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1fdb0 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a   being queried *
1fdc0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fde0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65      /* Index use
1fdf0 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63  d to optimize sc
1fe00 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29  an, or NULL */.)
1fe10 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
1fe20 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
1fe30 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73    char *zEqp = s
1fe40 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
1fe50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20  arse->db, "SCAN 
1fe60 54 41 42 4c 45 20 25 73 20 25 73 25 73 28 7e 25  TABLE %s %s%s(~%
1fe70 64 20 72 6f 77 73 29 22 2c 0a 20 20 20 20 20 20  d rows)",.      
1fe80 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a    pTab->zName, .
1fe90 20 20 20 20 20 20 20 20 70 49 64 78 20 3f 20 22          pIdx ? "
1fea0 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
1feb0 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20  NDEX " : "",.   
1fec0 20 20 20 20 20 70 49 64 78 20 3f 20 70 49 64 78       pIdx ? pIdx
1fed0 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 2c 0a 20 20  ->zName : "",.  
1fee0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77        pTab->nRow
1fef0 45 73 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  Est.    );.    s
1ff00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1ff10 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
1ff20 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c  ->pVdbe, OP_Expl
1ff30 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
1ff40 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45  lectId, 0, 0, zE
1ff50 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20  qp, P4_DYNAMIC. 
1ff60 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73     );.  }.}.#els
1ff70 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  e.# define expla
1ff80 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c  inSimpleCount(a,
1ff90 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  b,c).#endif../*.
1ffa0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1ffb0 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20   for the SELECT 
1ffc0 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
1ffd0 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e  in the p argumen
1ffe0 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  t.  .**.** The r
1fff0 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 72  esults are distr
20000 69 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75  ibuted in variou
20010 73 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67  s ways depending
20020 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65   on the.** conte
20030 6e 74 73 20 6f 66 20 74 68 65 20 53 65 6c 65 63  nts of the Selec
20040 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 20  tDest structure 
20050 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 61 72  pointed to by ar
20060 67 75 6d 65 6e 74 20 70 44 65 73 74 0a 2a 2a 20  gument pDest.** 
20070 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
20080 2a 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65  *     pDest->eDe
20090 73 74 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20  st    Result.** 
200a0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
200b0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
200c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
200d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
200e0 2a 2a 20 20 20 20 20 53 52 54 5f 4f 75 74 70 75  **     SRT_Outpu
200f0 74 20 20 20 20 20 20 47 65 6e 65 72 61 74 65 20  t      Generate 
20100 61 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20  a row of output 
20110 28 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 52 65  (using the OP_Re
20120 73 75 6c 74 52 6f 77 0a 2a 2a 20 20 20 20 20 20  sultRow.**      
20130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
20140 70 63 6f 64 65 29 20 66 6f 72 20 65 61 63 68 20  pcode) for each 
20150 72 6f 77 20 69 6e 20 74 68 65 20 72 65 73 75 6c  row in the resul
20160 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  t set..**.**    
20170 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20   SRT_Mem        
20180 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 74   Only valid if t
20190 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 73  he result is a s
201a0 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  ingle column..**
201b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201c0 20 20 20 20 20 53 74 6f 72 65 20 74 68 65 20 66       Store the f
201d0 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  irst column of t
201e0 68 65 20 66 69 72 73 74 20 72 65 73 75 6c 74 20  he first result 
201f0 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  row.**          
20200 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 72 65             in re
20210 67 69 73 74 65 72 20 70 44 65 73 74 2d 3e 69 50  gister pDest->iP
20220 61 72 6d 20 74 68 65 6e 20 61 62 61 6e 64 6f 6e  arm then abandon
20230 20 74 68 65 20 72 65 73 74 0a 2a 2a 20 20 20 20   the rest.**    
20240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20250 20 6f 66 20 74 68 65 20 71 75 65 72 79 2e 20 20   of the query.  
20260 54 68 69 73 20 64 65 73 74 69 6e 61 74 69 6f 6e  This destination
20270 20 69 6d 70 6c 69 65 73 20 22 4c 49 4d 49 54 20   implies "LIMIT 
20280 31 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  1"..**.**     SR
20290 54 5f 53 65 74 20 20 20 20 20 20 20 20 20 54 68  T_Set         Th
202a0 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65  e result must be
202b0 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
202c0 2e 20 20 53 74 6f 72 65 20 65 61 63 68 0a 2a 2a  .  Store each.**
202d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202e0 20 20 20 20 20 72 6f 77 20 6f 66 20 72 65 73 75       row of resu
202f0 6c 74 20 61 73 20 74 68 65 20 6b 65 79 20 69 6e  lt as the key in
20300 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50   table pDest->iP
20310 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20  arm. .**        
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 41 70 70               App
20330 6c 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  ly the affinity 
20340 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 20  pDest->affinity 
20350 62 65 66 6f 72 65 20 73 74 6f 72 69 6e 67 0a 2a  before storing.*
20360 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
20370 20 20 20 20 20 20 72 65 73 75 6c 74 73 2e 20 20        results.  
20380 55 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  Used to implemen
20390 74 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  t "IN (SELECT ..
203a0 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  .)"..**.**     S
203b0 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53  RT_Union       S
203c0 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20  tore results as 
203d0 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f  a key in a tempo
203e0 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74  rary table pDest
203f0 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  ->iParm..**.**  
20400 20 20 20 53 52 54 5f 45 78 63 65 70 74 20 20 20     SRT_Except   
20410 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74     Remove result
20420 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f  s from the tempo
20430 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74  rary table pDest
20440 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  ->iParm..**.**  
20450 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20     SRT_Table    
20460 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
20470 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   in temporary ta
20480 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ble pDest->iParm
20490 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
204a0 20 20 20 20 20 20 20 20 20 54 68 69 73 20 69 73           This is
204b0 20 6c 69 6b 65 20 53 52 54 5f 45 70 68 65 6d 54   like SRT_EphemT
204c0 61 62 20 65 78 63 65 70 74 20 74 68 61 74 20 74  ab except that t
204d0 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  he table.**     
204e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204f0 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 61 6c  is assumed to al
20500 72 65 61 64 79 20 62 65 20 6f 70 65 6e 2e 0a 2a  ready be open..*
20510 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 70 68  *.**     SRT_Eph
20520 65 6d 54 61 62 20 20 20 20 43 72 65 61 74 65 20  emTab    Create 
20530 61 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  an temporary tab
20540 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20  le pDest->iParm 
20550 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 20 20 20  and store.**    
20560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20570 20 74 68 65 20 72 65 73 75 6c 74 20 74 68 65 72   the result ther
20580 65 2e 20 54 68 65 20 63 75 72 73 6f 72 20 69 73  e. The cursor is
20590 20 6c 65 66 74 20 6f 70 65 6e 20 61 66 74 65 72   left open after
205a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
205b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 69 6e          returnin
205c0 67 2e 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65  g.  This is like
205d0 20 53 52 54 5f 54 61 62 6c 65 20 65 78 63 65 70   SRT_Table excep
205e0 74 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  t that.**       
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
20600 69 73 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 75  is destination u
20610 73 65 73 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  ses OP_OpenEphem
20620 65 72 61 6c 20 74 6f 20 63 72 65 61 74 65 0a 2a  eral to create.*
20630 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
20640 20 20 20 20 20 20 74 68 65 20 74 61 62 6c 65 20        the table 
20650 66 69 72 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  first..**.**    
20660 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 20   SRT_Coroutine  
20670 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 2d 72   Generate a co-r
20680 6f 75 74 69 6e 65 20 74 68 61 74 20 72 65 74 75  outine that retu
20690 72 6e 73 20 61 20 6e 65 77 20 72 6f 77 20 6f 66  rns a new row of
206a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
206b0 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 73 20          results 
206c0 65 61 63 68 20 74 69 6d 65 20 69 74 20 69 73 20  each time it is 
206d0 69 6e 76 6f 6b 65 64 2e 20 20 54 68 65 20 65 6e  invoked.  The en
206e0 74 72 79 20 70 6f 69 6e 74 0a 2a 2a 20 20 20 20  try point.**    
206f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20700 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69   of the co-routi
20710 6e 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ne is stored in 
20720 72 65 67 69 73 74 65 72 20 70 44 65 73 74 2d 3e  register pDest->
20730 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
20740 20 53 52 54 5f 45 78 69 73 74 73 20 20 20 20 20   SRT_Exists     
20750 20 53 74 6f 72 65 20 61 20 31 20 69 6e 20 6d 65   Store a 1 in me
20760 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d  mory cell pDest-
20770 3e 69 50 61 72 6d 20 69 66 20 74 68 65 20 72 65  >iParm if the re
20780 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  sult.**         
20790 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
207a0 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a  is not empty..**
207b0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44 69 73 63  .**     SRT_Disc
207c0 61 72 64 20 20 20 20 20 54 68 72 6f 77 20 74 68  ard     Throw th
207d0 65 20 72 65 73 75 6c 74 73 20 61 77 61 79 2e 20  e results away. 
207e0 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
207f0 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
20800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
20810 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69 6e  tatements within
20820 20 74 72 69 67 67 65 72 73 20 77 68 6f 73 65 20   triggers whose 
20830 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20 69 73 0a  only purpose is.
20840 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
20850 20 20 20 20 20 20 20 74 68 65 20 73 69 64 65 2d         the side-
20860 65 66 66 65 63 74 73 20 6f 66 20 66 75 6e 63 74  effects of funct
20870 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ions..**.** This
20880 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
20890 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
208a0 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65  rrors.  If any e
208b0 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63  rrors are.** enc
208c0 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61  ountered, then a
208d0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
208e0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c  ror message is l
208f0 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  eft in.** pParse
20900 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
20910 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
20920 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20  es NOT free the 
20930 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
20940 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65   passed in.  The
20950 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  .** calling func
20960 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f  tion needs to do
20970 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71   that..*/.int sq
20980 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50  lite3Select(.  P
20990 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
209a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
209b0 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
209c0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
209d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
209e0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
209f0 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
20a00 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
20a10 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74  est      /* What
20a20 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20   to do with the 
20a30 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
20a40 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
20a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20a60 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
20a70 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
20a80 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74  Info;     /* Ret
20a90 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  urn from sqlite3
20aa0 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a  WhereBegin() */.
20ab0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
20ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20ad0 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
20ae0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
20af0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  on */.  int isAg
20b00 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
20b10 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63  * True for selec
20b20 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f  t lists like "co
20b30 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70  unt(*)" */.  Exp
20b40 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
20b50 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63      /* List of c
20b60 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63  olumns to extrac
20b70 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  t. */.  SrcList 
20b80 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f  *pTabList;     /
20b90 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
20ba0 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20   to select from 
20bb0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
20bc0 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
20bd0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
20be0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
20bf0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
20c00 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  derBy;    /* The
20c10 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
20c20 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
20c30 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
20c40 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68  roupBy;    /* Th
20c50 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
20c60 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
20c70 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
20c80 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng;         /* T
20c90 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
20ca0 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
20cb0 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e  /.  int isDistin
20cc0 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ct;        /* Tr
20cd0 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
20ce0 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  CT keyword is pr
20cf0 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64  esent */.  int d
20d00 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
20d10 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73    /* Table to us
20d20 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
20d30 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  ct set */.  int 
20d40 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
20d50 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
20d60 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
20d70 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  function */.  in
20d80 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b  t addrSortIndex;
20d90 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
20da0 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68  of an OP_OpenEph
20db0 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
20dc0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  on */.  int addr
20dd0 44 69 73 74 69 6e 63 74 49 6e 64 65 78 3b 20 2f  DistinctIndex; /
20de0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20  * Address of an 
20df0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
20e00 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
20e10 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e    AggInfo sAggIn
20e20 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f  fo;      /* Info
20e30 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20  rmation used by 
20e40 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
20e50 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b  s */.  int iEnd;
20e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20e70 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
20e80 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79  end of the query
20e90 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
20ea0 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
20eb0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
20ec0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e  nection */..#ifn
20ed0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20ee0 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52  EXPLAIN.  int iR
20ef0 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d  estoreSelectId =
20f00 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
20f10 49 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53  Id;.  pParse->iS
20f20 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65  electId = pParse
20f30 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b  ->iNextSelectId+
20f40 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20  +;.#endif..  db 
20f50 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
20f60 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  if( p==0 || db->
20f70 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
20f80 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
20f90 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
20fa0 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  }.  if( sqlite3A
20fb0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
20fc0 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
20fd0 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
20fe0 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n 1;.  memset(&s
20ff0 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  AggInfo, 0, size
21000 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a  of(sAggInfo));..
21010 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f    if( IgnorableO
21020 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
21030 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73  .    assert(pDes
21040 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
21050 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65  ists || pDest->e
21060 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20  Dest==SRT_Union 
21070 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  || .           p
21080 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
21090 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74  _Except || pDest
210a0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
210b0 63 61 72 64 29 3b 0a 20 20 20 20 2f 2a 20 49 66  card);.    /* If
210c0 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20   ORDER BY makes 
210d0 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e  no difference in
210e0 20 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e   the output then
210f0 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20   neither does.  
21100 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f    ** DISTINCT so
21110 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76   it can be remov
21120 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73  ed too. */.    s
21130 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
21140 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
21150 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  erBy);.    p->pO
21160 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
21170 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
21180 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  SF_Distinct;.  }
21190 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
211a0 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Prep(pParse, p, 
211b0 30 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d  0);.  pOrderBy =
211c0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
211d0 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
211e0 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
211f0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
21200 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
21210 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
21220 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
21230 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  ect_end;.  }.  i
21240 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c  sAgg = (p->selFl
21250 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
21260 74 65 29 21 3d 30 3b 0a 20 20 61 73 73 65 72 74  te)!=0;.  assert
21270 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a  ( pEList!=0 );..
21280 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
21290 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f  ating code..  */
212a0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
212b0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
212c0 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
212d0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
212e0 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f  /* If writing to
212f0 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72   memory or gener
21300 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a  ating a set.  **
21310 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63   only a single c
21320 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74  olumn may be out
21330 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  put..  */.#ifnde
21340 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
21350 42 51 55 45 52 59 0a 20 20 69 66 28 20 63 68 65  BQUERY.  if( che
21360 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e  ckForMultiColumn
21370 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  SelectError(pPar
21380 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73  se, pDest, pELis
21390 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
213a0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
213b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
213c0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
213d0 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
213e0 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
213f0 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66   clause.  */.#if
21400 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
21410 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
21420 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
21430 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20  TE_OMIT_VIEW).  
21440 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72  for(i=0; !p->pPr
21450 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73  ior && i<pTabLis
21460 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
21470 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
21480 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
21490 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
214a0 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20  .    SelectDest 
214b0 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  dest;.    Select
214c0 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e   *pSub = pItem->
214d0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74  pSelect;.    int
214e0 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20 20 20   isAggSub;..    
214f0 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f  if( pSub==0 ) co
21500 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
21510 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
21520 75 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ub ){.      sqli
21530 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21540 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d   OP_Gosub, pItem
21550 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74  ->regReturn, pIt
21560 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
21570 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
21580 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
21590 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e  Increment Parse.
215a0 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68  nHeight by the h
215b0 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72  eight of the lar
215c0 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a  gest expression.
215d0 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65      ** tree refe
215e0 72 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20  red to by this, 
215f0 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63  the parent selec
21600 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c  t. The child sel
21610 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63  ect.    ** may c
21620 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f  ontain expressio
21630 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f  n trees of at mo
21640 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54  st.    ** (SQLIT
21650 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
21660 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20  -Parse.nHeight) 
21670 68 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20  height. This is 
21680 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72  a bit.    ** mor
21690 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74  e conservative t
216a0 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62  han necessary, b
216b0 75 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74  ut much easier t
216c0 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20  han enforcing.  
216d0 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69    ** an exact li
216e0 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mit..    */.    
216f0 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
21700 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  += sqlite3Select
21710 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a  ExprHeight(p);..
21720 20 20 20 20 69 73 41 67 67 53 75 62 20 3d 20 28      isAggSub = (
21730 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
21740 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d   SF_Aggregate)!=
21750 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74  0;.    if( flatt
21760 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73  enSubquery(pPars
21770 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20  e, p, i, isAgg, 
21780 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20  isAggSub) ){.   
21790 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75     /* This subqu
217a0 65 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72  ery can be absor
217b0 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72  bed into its par
217c0 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ent. */.      if
217d0 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20  ( isAggSub ){.  
217e0 20 20 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b        isAgg = 1;
217f0 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46  .        p->selF
21800 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65  lags |= SF_Aggre
21810 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gate;.      }.  
21820 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20      i = -1;.    
21830 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
21840 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
21850 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
21860 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61  fill an ephemera
21870 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20  l table with.   
21880 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e     ** the conten
21890 74 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65  t of this subque
218a0 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72  ry.  pItem->addr
218b0 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69  FillSub will poi
218c0 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  nt.      ** to t
218d0 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
218e0 65 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72  e generated subr
218f0 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e  outine.  pItem->
21900 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20  regReturn.      
21910 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72  ** is a register
21920 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f   allocated to ho
21930 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ld the subroutin
21940 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
21950 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21960 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20  int topAddr;.   
21970 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20     int onceAddr 
21980 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  = 0;.      int r
21990 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20 61 73  etAddr;.      as
219a0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64  sert( pItem->add
219b0 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20  rFillSub==0 );. 
219c0 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52       pItem->regR
219d0 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
219e0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f  ->nMem;.      to
219f0 70 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  pAddr = sqlite3V
21a00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21a10 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65  Integer, 0, pIte
21a20 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
21a30 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72       pItem->addr
21a40 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64  FillSub = topAdd
21a50 72 2b 31 3b 0a 20 20 20 20 20 20 56 64 62 65 4e  r+1;.      VdbeN
21a60 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
21a70 6d 61 74 65 72 69 61 6c 69 7a 65 20 25 73 22 2c  materialize %s",
21a80 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
21a90 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ame));.      if(
21aa0 20 70 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c   pItem->isCorrel
21ab0 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ated==0 ){.     
21ac0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62     /* If the sub
21ad0 71 75 65 72 79 20 69 73 20 6e 6f 20 63 6f 72 72  query is no corr
21ae0 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77 65  elated and if we
21af0 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20   are not inside 
21b00 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  of.        ** a 
21b10 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65  trigger, then we
21b20 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f   only need to co
21b30 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20  mpute the value 
21b40 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a  of the subquery.
21b50 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e          ** once.
21b60 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65   */.        once
21b70 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f  Addr = sqlite3Co
21b80 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a  deOnce(pParse);.
21b90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
21ba0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
21bb0 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45  nit(&dest, SRT_E
21bc0 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e  phemTab, pItem->
21bd0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
21be0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
21bf0 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  r(pItem->iSelect
21c00 49 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e  Id, (u8)pParse->
21c10 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
21c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
21c30 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ect(pParse, pSub
21c40 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
21c50 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
21c60 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  wEst = (unsigned
21c70 29 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f  )pSub->nSelectRo
21c80 77 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63  w;.      if( onc
21c90 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56  eAddr ) sqlite3V
21ca0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f  dbeJumpHere(v, o
21cb0 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20  nceAddr);.      
21cc0 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65  retAddr = sqlite
21cd0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
21ce0 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d  P_Return, pItem-
21cf0 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
21d00 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
21d10 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74  v, "end %s", pIt
21d20 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
21d30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21d40 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
21d50 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64 72  topAddr, retAddr
21d60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21d70 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
21d80 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
21d90 0a 20 20 20 20 69 66 28 20 2f 2a 70 50 61 72 73  .    if( /*pPars
21da0 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d  e->nErr ||*/ db-
21db0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
21dc0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
21dd0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
21de0 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
21df0 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t -= sqlite3Sele
21e00 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
21e10 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
21e20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28  p->pSrc;.    if(
21e30 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
21e40 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
21e50 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d     pOrderBy = p-
21e60 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d  >pOrderBy;.    }
21e70 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20  .  }.  pEList = 
21e80 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69  p->pEList;.#endi
21e90 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  f.  pWhere = p->
21ea0 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70  pWhere;.  pGroup
21eb0 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
21ec0 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
21ed0 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69  >pHaving;.  isDi
21ee0 73 74 69 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c  stinct = (p->sel
21ef0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
21f00 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65  nct)!=0;..#ifnde
21f10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
21f20 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
21f30 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
21f40 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  re a sequence of
21f50 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65   queries, do the
21f60 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69   earlier ones fi
21f70 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rst..  */.  if( 
21f80 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
21f90 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f   if( p->pRightmo
21fa0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  st==0 ){.      S
21fb0 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70  elect *pLoop, *p
21fc0 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20  Right = 0;.     
21fd0 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
21fe0 20 20 20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74      int mxSelect
21ff0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f  ;.      for(pLoo
22000 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  p=p; pLoop; pLoo
22010 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c  p=pLoop->pPrior,
22020 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20   cnt++){.       
22030 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f   pLoop->pRightmo
22040 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
22050 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70  pLoop->pNext = p
22060 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 70  Right;.        p
22070 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20  Right = pLoop;. 
22080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 78 53       }.      mxS
22090 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d  elect = db->aLim
220a0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
220b0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d  COMPOUND_SELECT]
220c0 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78 53 65  ;.      if( mxSe
220d0 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d 78 53 65  lect && cnt>mxSe
220e0 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
220f0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
22100 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
22110 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f  y terms in compo
22120 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20  und SELECT");.  
22130 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
22140 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
22150 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 75     }.    rc = mu
22160 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
22170 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20  , p, pDest);.   
22180 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
22190 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  er(pParse->iSele
221a0 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65  ctId, iRestoreSe
221b0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 72 65 74  lectId);.    ret
221c0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
221d0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  if..  /* If ther
221e0 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55  e is both a GROU
221f0 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45  P BY and an ORDE
22200 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20  R BY clause and 
22210 74 68 65 79 20 61 72 65 0a 20 20 2a 2a 20 69 64  they are.  ** id
22220 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 64 69  entical, then di
22230 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20  sable the ORDER 
22240 42 59 20 63 6c 61 75 73 65 20 73 69 6e 63 65 20  BY clause since 
22250 74 68 65 20 47 52 4f 55 50 20 42 59 0a 20 20 2a  the GROUP BY.  *
22260 2a 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65  * will cause ele
22270 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75  ments to come ou
22280 74 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  t in the correct
22290 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69 73   order.  This is
222a0 0a 20 20 2a 2a 20 61 6e 20 6f 70 74 69 6d 69 7a  .  ** an optimiz
222b0 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72  ation - the corr
222c0 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c  ect answer shoul
222d0 64 20 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c  d result regardl
222e0 65 73 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68  ess..  ** Use th
222f0 65 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79  e SQLITE_GroupBy
22300 4f 72 64 65 72 20 66 6c 61 67 20 77 69 74 68 20  Order flag with 
22310 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
22320 4f 50 54 49 4d 49 5a 45 52 0a 20 20 2a 2a 20 74  OPTIMIZER.  ** t
22330 6f 20 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f  o disable this o
22340 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
22350 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
22360 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
22370 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
22380 61 72 65 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c  are(p->pGroupBy,
22390 20 70 4f 72 64 65 72 42 79 29 3d 3d 30 0a 20 20   pOrderBy)==0.  
223a0 20 20 20 20 20 20 20 26 26 20 28 64 62 2d 3e 66         && (db->f
223b0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 47 72  lags & SQLITE_Gr
223c0 6f 75 70 42 79 4f 72 64 65 72 29 3d 3d 30 20 29  oupByOrder)==0 )
223d0 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d  {.    pOrderBy =
223e0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
223f0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49   the query is DI
22400 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f  STINCT with an O
22410 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e  RDER BY but is n
22420 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c  ot an aggregate,
22430 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68   and .  ** if th
22440 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73  e select-list is
22450 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
22460 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20   ORDER BY list, 
22470 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a  then this query.
22480 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72    ** can be rewr
22490 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50  itten as a GROUP
224a0 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f   BY. In other wo
224b0 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  rds, this:.  **.
224c0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
224d0 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f  DISTINCT xyz FRO
224e0 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78  M ... ORDER BY x
224f0 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20  yz.  **.  ** is 
22500 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a  transformed to:.
22510 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
22520 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  LECT xyz FROM ..
22530 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 0a 20  . GROUP BY xyz. 
22540 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63   **.  ** The sec
22550 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66  ond form is pref
22560 65 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c  erred as a singl
22570 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70  e index (or temp
22580 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a  -table) may be .
22590 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f    ** used for bo
225a0 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
225b0 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f  and DISTINCT pro
225c0 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67  cessing. As orig
225d0 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69  inally .  ** wri
225e0 74 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d  tten the query m
225f0 75 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74  ust use a temp-t
22600 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73  able for at leas
22610 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44  t one of the ORD
22620 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20  ER .  ** BY and 
22630 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e  DISTINCT, and an
22640 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61   index or separa
22650 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f  te temp-table fo
22660 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a  r the other..  *
22670 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  /.  if( (p->selF
22680 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
22690 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
226a0 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
226b0 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78  .   && sqlite3Ex
226c0 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 4f  prListCompare(pO
226d0 72 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73  rderBy, p->pELis
226e0 74 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70  t)==0.  ){.    p
226f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
22700 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20  F_Distinct;.    
22710 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
22720 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
22730 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
22740 30 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79  0);.    pGroupBy
22750 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
22760 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
22770 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
22780 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
22790 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
227a0 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20   this sorting.  
227b0 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65  ** index might e
227c0 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73  nd up being unus
227d0 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63  ed if the data c
227e0 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72  an be .  ** extr
227f0 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72  acted in pre-sor
22800 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74  ted order.  If t
22810 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c  hat is the case,
22820 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f   then the.  ** O
22830 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
22840 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c  instruction will
22850 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61   be changed to a
22860 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20  n OP_Noop once. 
22870 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75   ** we figure ou
22880 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69  t that the sorti
22890 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  ng index is not 
228a0 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61 64 64  needed.  The add
228b0 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20  rSortIndex.  ** 
228c0 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
228d0 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74   to facilitate t
228e0 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f  hat change..  */
228f0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
22900 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
22910 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b  pKeyInfo;.    pK
22920 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
22930 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
22940 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  rse, pOrderBy);.
22950 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45      pOrderBy->iE
22960 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
22970 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e  >nTab++;.    p->
22980 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
22990 3d 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  = addrSortIndex 
229a0 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  =.      sqlite3V
229b0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
229c0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
229d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229e0 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72            pOrder
229f0 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f  By->iECursor, pO
22a00 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c  rderBy->nExpr+2,
22a10 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
22a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
22a30 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
22a40 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
22a50 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  FF);.  }else{.  
22a60 20 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20    addrSortIndex 
22a70 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
22a80 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
22a90 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
22aa0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
22ab0 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
22ac0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  ..  */.  if( pDe
22ad0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
22ae0 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73  phemTab ){.    s
22af0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22b00 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
22b10 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 50 61  eral, pDest->iPa
22b20 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rm, pEList->nExp
22b30 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  r);.  }..  /* Se
22b40 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20  t the limiter.. 
22b50 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c   */.  iEnd = sql
22b60 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
22b70 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65  l(v);.  p->nSele
22b80 63 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29  ctRow = (double)
22b90 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20  LARGEST_INT64;. 
22ba0 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
22bb0 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
22bc0 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70  , iEnd);.  if( p
22bd0 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 61  ->iLimit==0 && a
22be0 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20  ddrSortIndex>=0 
22bf0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
22c00 62 65 47 65 74 4f 70 28 76 2c 20 61 64 64 72 53  beGetOp(v, addrS
22c10 6f 72 74 49 6e 64 65 78 29 2d 3e 6f 70 63 6f 64  ortIndex)->opcod
22c20 65 20 3d 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  e = OP_SorterOpe
22c30 6e 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  n;.    p->selFla
22c40 67 73 20 7c 3d 20 53 46 5f 55 73 65 53 6f 72 74  gs |= SF_UseSort
22c50 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  er;.  }..  /* Op
22c60 65 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  en a virtual ind
22c70 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  ex to use for th
22c80 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a  e distinct set..
22c90 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
22ca0 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
22cb0 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49  inct ){.    KeyI
22cc0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
22cd0 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50     distinct = pP
22ce0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
22cf0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
22d00 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
22d10 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
22d20 73 74 29 3b 0a 20 20 20 20 61 64 64 72 44 69 73  st);.    addrDis
22d30 74 69 6e 63 74 49 6e 64 65 78 20 3d 20 73 71 6c  tinctIndex = sql
22d40 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
22d50 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
22d60 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 2c  al, distinct, 0,
22d70 20 30 2c 0a 20 20 20 20 20 20 20 20 28 63 68 61   0,.        (cha
22d80 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
22d90 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
22da0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
22db0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52  eChangeP5(v, BTR
22dc0 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
22dd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74   }else{.    dist
22de0 69 6e 63 74 20 3d 20 61 64 64 72 44 69 73 74 69  inct = addrDisti
22df0 6e 63 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20  nctIndex = -1;. 
22e00 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61   }..  /* Aggrega
22e10 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65  te and non-aggre
22e20 67 61 74 65 20 71 75 65 72 69 65 73 20 61 72 65  gate queries are
22e30 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
22e40 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69  ntly */.  if( !i
22e50 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79  sAgg && pGroupBy
22e60 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  ==0 ){.    ExprL
22e70 69 73 74 20 2a 70 44 69 73 74 20 3d 20 28 69 73  ist *pDist = (is
22e80 44 69 73 74 69 6e 63 74 20 3f 20 70 2d 3e 70 45  Distinct ? p->pE
22e90 4c 69 73 74 20 3a 20 30 29 3b 0a 0a 20 20 20 20  List : 0);..    
22ea0 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74  /* Begin the dat
22eb0 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20  abase scan. */. 
22ec0 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
22ed0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
22ee0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
22ef0 70 57 68 65 72 65 2c 20 26 70 4f 72 64 65 72 42  pWhere, &pOrderB
22f00 79 2c 20 70 44 69 73 74 2c 20 30 29 3b 0a 20 20  y, pDist, 0);.  
22f10 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
22f20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
22f30 64 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  d;.    if( pWInf
22f40 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3c 20 70 2d 3e  o->nRowOut < p->
22f50 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e  nSelectRow ) p->
22f60 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 57 49  nSelectRow = pWI
22f70 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20  nfo->nRowOut;.. 
22f80 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67     /* If sorting
22f90 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20   index that was 
22fa0 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69  created by a pri
22fb0 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
22fc0 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74  ral .    ** inst
22fd0 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70  ruction ended up
22fe0 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65   not being neede
22ff0 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74  d, then change t
23000 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
23010 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ral.    ** into 
23020 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20  an OP_Noop..    
23030 2a 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72 53  */.    if( addrS
23040 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70  ortIndex>=0 && p
23050 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
23060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
23070 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
23080 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20  ddrSortIndex);. 
23090 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
230a0 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[2] = -1;.  
230b0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 57 49    }..    if( pWI
230c0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29  nfo->eDistinct )
230d0 7b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  {.      VdbeOp *
230e0 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  pOp;            
230f0 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72      /* No longer
23100 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70   required OpenEp
23110 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a  hemeral instr. *
23120 2f 0a 20 20 20 20 20 0a 20 20 20 20 20 20 61 73  /.     .      as
23130 73 65 72 74 28 20 61 64 64 72 44 69 73 74 69 6e  sert( addrDistin
23140 63 74 49 6e 64 65 78 3e 3d 30 20 29 3b 0a 20 20  ctIndex>=0 );.  
23150 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
23160 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64  3VdbeGetOp(v, ad
23170 64 72 44 69 73 74 69 6e 63 74 49 6e 64 65 78 29  drDistinctIndex)
23180 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
23190 20 69 73 44 69 73 74 69 6e 63 74 20 29 3b 0a 20   isDistinct );. 
231a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49       assert( pWI
231b0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d  nfo->eDistinct==
231c0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
231d0 52 44 45 52 45 44 20 0a 20 20 20 20 20 20 20 20  RDERED .        
231e0 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 65 44     || pWInfo->eD
231f0 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44  istinct==WHERE_D
23200 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 20 0a  ISTINCT_UNIQUE .
23210 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 64        );.      d
23220 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
23230 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
23240 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45  eDistinct==WHERE
23250 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
23260 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  D ){.        int
23270 20 69 4a 75 6d 70 3b 0a 20 20 20 20 20 20 20 20   iJump;.        
23280 69 6e 74 20 69 45 78 70 72 3b 0a 20 20 20 20 20  int iExpr;.     
23290 20 20 20 69 6e 74 20 69 46 6c 61 67 20 3d 20 2b     int iFlag = +
232a0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
232b0 20 20 20 20 20 20 20 69 6e 74 20 69 42 61 73 65         int iBase
232c0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
232d0 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  1;.        int i
232e0 42 61 73 65 32 20 3d 20 69 42 61 73 65 20 2b 20  Base2 = iBase + 
232f0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
23300 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
23310 4d 65 6d 20 2b 3d 20 28 70 45 4c 69 73 74 2d 3e  Mem += (pEList->
23320 6e 45 78 70 72 2a 32 29 3b 0a 0a 20 20 20 20 20  nExpr*2);..     
23330 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
23340 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
23350 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20  l coded earlier 
23360 74 6f 20 61 6e 20 4f 50 5f 49 6e 74 65 67 65 72  to an OP_Integer
23370 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
23380 20 4f 50 5f 49 6e 74 65 67 65 72 20 69 6e 69 74   OP_Integer init
23390 69 61 6c 69 7a 65 73 20 74 68 65 20 22 66 69 72  ializes the "fir
233a0 73 74 20 72 6f 77 22 20 66 6c 61 67 2e 20 20 2a  st row" flag.  *
233b0 2f 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f  /.        pOp->o
233c0 70 63 6f 64 65 20 3d 20 4f 50 5f 49 6e 74 65 67  pcode = OP_Integ
233d0 65 72 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  er;.        pOp-
233e0 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  >p1 = 1;.       
233f0 20 70 4f 70 2d 3e 70 32 20 3d 20 69 46 6c 61 67   pOp->p2 = iFlag
23400 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;..        sqlit
23410 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
23420 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  st(pParse, pELis
23430 74 2c 20 69 42 61 73 65 2c 20 31 29 3b 0a 20 20  t, iBase, 1);.  
23440 20 20 20 20 20 20 69 4a 75 6d 70 20 3d 20 73 71        iJump = sq
23450 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
23460 41 64 64 72 28 76 29 20 2b 20 31 20 2b 20 70 45  Addr(v) + 1 + pE
23470 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 31 20  List->nExpr + 1 
23480 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  + 1;.        sql
23490 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
234a0 2c 20 4f 50 5f 49 66 2c 20 69 46 6c 61 67 2c 20  , OP_If, iFlag, 
234b0 69 4a 75 6d 70 2d 31 29 3b 0a 20 20 20 20 20 20  iJump-1);.      
234c0 20 20 66 6f 72 28 69 45 78 70 72 3d 30 3b 20 69    for(iExpr=0; i
234d0 45 78 70 72 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  Expr<pEList->nEx
234e0 70 72 3b 20 69 45 78 70 72 2b 2b 29 7b 0a 20 20  pr; iExpr++){.  
234f0 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
23500 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
23510 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
23520 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 45  se, pEList->a[iE
23530 78 70 72 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  xpr].pExpr);.   
23540 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
23550 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
23560 65 2c 20 69 42 61 73 65 2b 69 45 78 70 72 2c 20  e, iBase+iExpr, 
23570 69 4a 75 6d 70 2c 20 69 42 61 73 65 32 2b 69 45  iJump, iBase2+iE
23580 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
23590 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
235a0 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73  eP4(v, -1, (cons
235b0 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20  t char *)pColl, 
235c0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
235d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
235e0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
235f0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
23600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23610 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23620 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
23630 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
23640 75 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 73 71  ue);..        sq
23650 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
23660 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
23670 2c 20 69 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  , iFlag);.      
23680 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
23690 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
236a0 28 76 29 3d 3d 69 4a 75 6d 70 20 29 3b 0a 20 20  (v)==iJump );.  
236b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
236c0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 6f  eAddOp3(v, OP_Mo
236d0 76 65 2c 20 69 42 61 73 65 2c 20 69 42 61 73 65  ve, iBase, iBase
236e0 32 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  2, pEList->nExpr
236f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
23700 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
23710 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  ode = OP_Noop;. 
23720 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
23730 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
23740 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
23750 2e 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49  . */.    selectI
23760 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
23770 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30   p, pEList, 0, 0
23780 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74  , pOrderBy, dist
23790 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20  inct, pDest,.   
237a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237b0 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
237c0 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ue, pWInfo->iBre
237d0 61 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64  ak);..    /* End
237e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
237f0 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
23800 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
23810 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  End(pWInfo);.  }
23820 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
23830 73 20 69 73 20 74 68 65 20 70 72 6f 63 65 73 73  s is the process
23840 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
23850 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20  e queries */.   
23860 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
23870 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  ;    /* Name con
23880 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73  text for process
23890 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e  ing aggregate in
238a0 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
238b0 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20   int iAMem;     
238c0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
238d0 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74  m address for st
238e0 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52  oring current GR
238f0 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
23900 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iBMem;        
23910 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
23920 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69  ddress for previ
23930 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ous GROUP BY */.
23940 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67      int iUseFlag
23950 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ;       /* Mem a
23960 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66  ddress holding f
23970 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74  lag indicating t
23980 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20  hat at least.   
23990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239a0 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20       ** one row 
239b0 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20  of the input to 
239c0 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68  the aggregator h
239d0 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  as been.        
239e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239f0 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ** processed */.
23a00 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c      int iAbortFl
23a10 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ag;     /* Mem a
23a20 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75  ddress which cau
23a30 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20  ses query abort 
23a40 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20  if positive */. 
23a50 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f     int groupBySo
23a60 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63  rt;    /* Rows c
23a70 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20  ome from source 
23a80 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
23a90 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
23aa0 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  rEnd;        /* 
23ab0 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e  End of processin
23ac0 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  g for this SELEC
23ad0 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  T */.    int sor
23ae0 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20  tPTab = 0;   /* 
23af0 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64  Pseudotable used
23b00 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69   to decode sorti
23b10 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  ng results */.  
23b20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20    int sortOut = 
23b30 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20  0;    /* Output 
23b40 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68  register from th
23b50 65 20 73 6f 72 74 65 72 20 2a 2f 0a 0a 20 20 20  e sorter */..   
23b60 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61   /* Remove any a
23b70 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62  nd all aliases b
23b80 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c  etween the resul
23b90 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20  t set and the.  
23ba0 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c    ** GROUP BY cl
23bb0 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ause..    */.   
23bc0 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
23bd0 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20  .      int k;   
23be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bf0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
23c00 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74  nter */.      st
23c10 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
23c20 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46  em *pItem;  /* F
23c30 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
23c40 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20  expression in a 
23c50 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66  list */..      f
23c60 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  or(k=p->pEList->
23c70 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e  nExpr, pItem=p->
23c80 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20  pEList->a; k>0; 
23c90 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
23ca0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41         pItem->iA
23cb0 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
23cc0 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47  }.      for(k=pG
23cd0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70  roupBy->nExpr, p
23ce0 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61  Item=pGroupBy->a
23cf0 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65  ; k>0; k--, pIte
23d00 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49  m++){.        pI
23d10 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b  tem->iAlias = 0;
23d20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23d30 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
23d40 3e 28 64 6f 75 62 6c 65 29 31 30 30 20 29 20 70  >(double)100 ) p
23d50 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 28  ->nSelectRow = (
23d60 64 6f 75 62 6c 65 29 31 30 30 3b 0a 20 20 20 20  double)100;.    
23d70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
23d80 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 28 64 6f  nSelectRow = (do
23d90 75 62 6c 65 29 31 3b 0a 20 20 20 20 7d 0a 0a 20  uble)1;.    }.. 
23da0 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61  .    /* Create a
23db0 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74   label to jump t
23dc0 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  o when we want t
23dd0 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65 72  o abort the quer
23de0 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64  y */.    addrEnd
23df0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
23e00 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20  keLabel(v);..   
23e10 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43   /* Convert TK_C
23e20 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f  OLUMN nodes into
23e30 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61   TK_AGG_COLUMN a
23e40 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20  nd make entries 
23e50 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e  in.    ** sAggIn
23e60 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47  fo for all TK_AG
23e70 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73  G_FUNCTION nodes
23e80 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20   in expressions 
23e90 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45  of the.    ** SE
23ea0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
23eb0 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65      */.    memse
23ec0 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
23ed0 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43  f(sNC));.    sNC
23ee0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
23ef0 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69  ;.    sNC.pSrcLi
23f00 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
23f10 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20     sNC.pAggInfo 
23f20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20  = &sAggInfo;.   
23f30 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
23f40 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75  ngColumn = pGrou
23f50 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e  pBy ? pGroupBy->
23f60 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20  nExpr+1 : 0;.   
23f70 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70   sAggInfo.pGroup
23f80 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20  By = pGroupBy;. 
23f90 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
23fa0 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
23fb0 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  C, pEList);.    
23fc0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
23fd0 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
23fe0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69  pOrderBy);.    i
23ff0 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
24000 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
24010 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
24020 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b  (&sNC, pHaving);
24030 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
24040 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  nfo.nAccumulator
24050 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   = sAggInfo.nCol
24060 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  umn;.    for(i=0
24070 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75  ; i<sAggInfo.nFu
24080 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nc; i++){.      
24090 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
240a0 50 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66  Property(sAggInf
240b0 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
240c0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
240d0 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46  );.      sNC.ncF
240e0 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67  lags |= NC_InAgg
240f0 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
24100 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
24110 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67  gList(&sNC, sAgg
24120 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45  Info.aFunc[i].pE
24130 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
24140 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73       sNC.ncFlags
24150 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e   &= ~NC_InAggFun
24160 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
24170 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
24180 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
24190 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  end;..    /* Pro
241a0 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
241b0 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55  egates with GROU
241c0 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66  P BY is very dif
241d0 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a  ferent and.    *
241e0 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70  * much more comp
241f0 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61  lex than aggrega
24200 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52  tes without a GR
24210 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20  OUP BY..    */. 
24220 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
24230 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  ){.      KeyInfo
24240 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20   *pKeyInfo;  /* 
24250 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  Keying informati
24260 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70  on for the group
24270 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
24280 20 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20      int j1;     
24290 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d          /* A-vs-
242a0 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75  B comparision ju
242b0 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mp */.      int 
242c0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20  addrOutputRow;  
242d0 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72  /* Start of subr
242e0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
242f0 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77  uts a result row
24300 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
24310 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a  gOutputRow;   /*
24320 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
24330 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74  register for out
24340 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  put subroutine *
24350 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
24360 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53  SetAbort;   /* S
24370 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61  et the abort fla
24380 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  g and return */.
24390 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
243a0 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70  pOfLoop;  /* Top
243b0 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f   of the input lo
243c0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  op */.      int 
243d0 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20  addrSortingIdx; 
243e0 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  /* The OP_OpenEp
243f0 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20  hemeral for the 
24400 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f  sorting index */
24410 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52  .      int addrR
24420 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75  eset;      /* Su
24430 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
24440 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
24450 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  ulator */.      
24460 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20  int regReset;   
24470 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64      /* Return ad
24480 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
24490 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74  or reset subrout
244a0 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ine */..      /*
244b0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47   If there is a G
244c0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77  ROUP BY clause w
244d0 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73  e might need a s
244e0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a  orting index to.
244f0 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
24500 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65  nt it.  Allocate
24510 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e   that sorting in
24520 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20  dex now.  If it 
24530 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20  turns out.      
24540 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
24550 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20  t need it after 
24560 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74  all, the OP_Sort
24570 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69  erOpen instructi
24580 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  on.      ** will
24590 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
245a0 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20  to a Noop.  .   
245b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67     */.      sAgg
245c0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20  Info.sortingIdx 
245d0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
245e0 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
245f0 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
24600 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
24610 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
24620 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d  addrSortingIdx =
24630 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24640 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f  p4(v, OP_SorterO
24650 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  pen, .          
24660 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
24670 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53  Idx, sAggInfo.nS
24680 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20  ortingColumn, . 
24690 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61           0, (cha
246a0 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
246b0 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
246c0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74  ;..      /* Init
246d0 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f  ialize memory lo
246e0 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20  cations used by 
246f0 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61  GROUP BY aggrega
24700 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20  te processing.  
24710 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73      */.      iUs
24720 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  eFlag = ++pParse
24730 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41  ->nMem;.      iA
24740 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61  bortFlag = ++pPa
24750 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
24760 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20   regOutputRow = 
24770 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
24780 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
24790 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
247a0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
247b0 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20       regReset = 
247c0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
247d0 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20        addrReset 
247e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
247f0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
24800 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iAMem = pParse-
24810 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
24820 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
24830 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
24840 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20  ;.      iBMem = 
24850 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
24860 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
24870 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
24880 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
24890 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
248a0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
248b0 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  0, iAbortFlag);.
248c0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
248d0 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f  t((v, "clear abo
248e0 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
248f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24900 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
24910 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 0, iUseFlag);
24920 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
24930 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
24940 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70   accumulator emp
24950 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ty"));.      sql
24960 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
24970 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41  , OP_Null, 0, iA
24980 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75  Mem, iAMem+pGrou
24990 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a  pBy->nExpr-1);..
249a0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61        /* Begin a
249b0 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
249c0 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72  extract all sour
249d0 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50  ce rows in GROUP
249e0 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20   BY order..     
249f0 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69   ** This might i
24a00 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72  nvolve two separ
24a10 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61  ate loops with a
24a20 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74  n OP_Sort in bet
24a30 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a  ween, or.      *
24a40 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  * it might be a 
24a50 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74  single loop that
24a60 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74   uses an index t
24a70 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d  o extract inform
24a80 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ation.      ** i
24a90 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65  n the right orde
24aa0 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e  r to begin with.
24ab0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
24ac0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24ad0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
24ae0 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
24af0 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  et);.      pWInf
24b00 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
24b10 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
24b20 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
24b30 26 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 30 29  &pGroupBy, 0, 0)
24b40 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
24b50 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
24b60 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69  ect_end;.      i
24b70 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  f( pGroupBy==0 )
24b80 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
24b90 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62   optimizer is ab
24ba0 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f  le to deliver ro
24bb0 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f  ws in group by o
24bc0 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20  rder so.        
24bd0 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76  ** we do not hav
24be0 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20  e to sort.  The 
24bf0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
24c00 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20   table will be. 
24c10 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c         ** cancel
24c20 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73  led later becaus
24c30 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  e we still need 
24c40 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49  to use the pKeyI
24c50 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nfo.        */. 
24c60 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20         pGroupBy 
24c70 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
24c80 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
24c90 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rt = 0;.      }e
24ca0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
24cb0 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20  Rows are coming 
24cc0 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69  out in undetermi
24cd0 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68  ned order.  We h
24ce0 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20  ave to push.    
24cf0 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20      ** each row 
24d00 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69  into a sorting i
24d10 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20  ndex, terminate 
24d20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a  the first loop,.
24d30 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
24d40 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f  loop over the so
24d50 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f  rting index in o
24d60 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
24d70 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a  output.        *
24d80 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  * in sorted orde
24d90 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  r.        */.   
24da0 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65       int regBase
24db0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  ;.        int re
24dc0 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20  gRecord;.       
24dd0 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
24de0 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b     int nGroupBy;
24df0 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ..        explai
24e00 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73  nTempTable(pPars
24e10 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
24e20 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 21 28  isDistinct && !(
24e30 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44  p->selFlags&SF_D
24e40 69 73 74 69 6e 63 74 29 3f 22 44 49 53 54 49 4e  istinct)?"DISTIN
24e50 43 54 22 3a 22 47 52 4f 55 50 20 42 59 22 29 3b  CT":"GROUP BY");
24e60 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  ..        groupB
24e70 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  ySort = 1;.     
24e80 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47     nGroupBy = pG
24e90 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
24ea0 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47         nCol = nG
24eb0 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20  roupBy + 1;.    
24ec0 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
24ed0 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  +1;.        for(
24ee0 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
24ef0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
24f00 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67           if( sAg
24f10 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53  gInfo.aCol[i].iS
24f20 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
24f30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43  {.            nC
24f40 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ol++;.          
24f50 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
24f60 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
24f70 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73       regBase = s
24f80 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
24f90 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29  ge(pParse, nCol)
24fa0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
24fb0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
24fc0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
24fd0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
24fe0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
24ff0 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61   pGroupBy, regBa
25000 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  se, 0);.        
25010 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25020 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
25030 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
25040 6e 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e 47  ngIdx,regBase+nG
25050 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20  roupBy);.       
25060 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b   j = nGroupBy+1;
25070 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
25080 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  ; i<sAggInfo.nCo
25090 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
250a0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
250b0 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
250c0 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b   &sAggInfo.aCol[
250d0 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
250e0 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
250f0 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
25100 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
25110 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20   j + regBase;.  
25120 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32            int r2
25130 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ;..            r
25140 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
25150 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
25160 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
25170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25180 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c       pCol->pTab,
25190 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20   pCol->iColumn, 
251a0 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31  pCol->iTable, r1
251b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
251c0 20 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a    if( r1!=r2 ){.
251d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
251e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
251f0 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c  v, OP_SCopy, r2,
25200 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
25210 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
25220 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
25230 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25240 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73     regRecord = s
25250 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
25260 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
25270 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25280 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
25290 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e  cord, regBase, n
252a0 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Col, regRecord);
252b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
252c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
252d0 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73  _SorterInsert, s
252e0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
252f0 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  dx, regRecord);.
25300 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
25310 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
25320 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
25330 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
25340 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
25350 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
25360 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
25370 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
25380 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
25390 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
253a0 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72  ingIdxPTab = sor
253b0 74 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  tPTab = pParse->
253c0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
253d0 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65  sortOut = sqlite
253e0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
253f0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
25400 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
25410 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
25420 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f   sortPTab, sortO
25430 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  ut, nCol);.     
25440 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25450 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
25460 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  rSort, sAggInfo.
25470 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
25480 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64  End);.        Vd
25490 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
254a0 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b  ROUP BY sort"));
254b0 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
254c0 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  o.useSortingIdx 
254d0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 1;.        sql
254e0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
254f0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
25500 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76    }..      /* Ev
25510 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65  aluate the curre
25520 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
25530 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62  s and store in b
25540 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20  0, b1, b2....   
25550 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d     ** (b0 is mem
25560 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d  ory location iBM
25570 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65  em+0, b1 is iBMe
25580 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  m+1, and so fort
25590 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  h).      ** Then
255a0 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72   compare the cur
255b0 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
255c0 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  rms against the 
255d0 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20  GROUP BY terms. 
255e0 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
255f0 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75   previous row cu
25600 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
25610 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a  n a0, a1, a2....
25620 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
25630 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73  ddrTopOfLoop = s
25640 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
25650 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
25660 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
25670 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
25680 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
25690 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
256a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
256b0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61  2(v, OP_SorterDa
256c0 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  ta, sAggInfo.sor
256d0 74 69 6e 67 49 64 78 2c 20 73 6f 72 74 4f 75 74  tingIdx, sortOut
256e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
256f0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f   for(j=0; j<pGro
25700 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  upBy->nExpr; j++
25710 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  ){.        if( g
25720 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
25730 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
25740 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
25750 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62  Column, sortPTab
25760 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  , j, iBMem+j);. 
25770 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
25780 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43  0 ) sqlite3VdbeC
25790 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
257a0 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20  G_CLEARCACHE);. 
257b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
257c0 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
257d0 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  .directMode = 1;
257e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
257f0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
25800 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a  e, pGroupBy->a[j
25810 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a  ].pExpr, iBMem+j
25820 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
25830 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
25840 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
25850 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65  OP_Compare, iAMe
25860 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iBMem, pGroup
25870 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  By->nExpr,.     
25880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25890 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
258a0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
258b0 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71  );.      j1 = sq
258c0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
258d0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
258e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
258f0 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b  (v, OP_Jump, j1+
25900 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20  1, 0, j1+1);..  
25910 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
25920 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77  code that runs w
25930 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55  henever the GROU
25940 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20  P BY changes..  
25950 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69      ** Changes i
25960 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  n the GROUP BY a
25970 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74  re detected by t
25980 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
25990 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e  .      ** block.
259a0 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20    If there were 
259b0 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73  no changes, this
259c0 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65   block is skippe
259d0 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
259e0 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63    ** This code c
259f0 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72  opies current gr
25a00 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20  oup by terms in 
25a10 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20  b0,b1,b2,....   
25a20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30     ** over to a0
25a30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e  ,a1,a2.  It then
25a40 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75   calls the outpu
25a50 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  t subroutine.   
25a60 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73     ** and resets
25a70 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
25a80 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
25a90 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74  ters in preparat
25aa0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  ion.      ** for
25ab0 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20   the next GROUP 
25ac0 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20  BY batch..      
25ad0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
25ae0 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
25af0 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65  rse, iBMem, iAMe
25b00 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
25b10 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
25b20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25b30 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
25b40 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70  putRow, addrOutp
25b50 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
25b60 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f  beComment((v, "o
25b70 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29  utput one row"))
25b80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
25b90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
25ba0 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61  IfPos, iAbortFla
25bb0 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  g, addrEnd);.   
25bc0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
25bd0 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20  v, "check abort 
25be0 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
25bf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
25c00 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
25c10 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
25c20 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
25c30 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74  mment((v, "reset
25c40 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
25c50 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
25c60 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  e the aggregate 
25c70 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73  accumulators bas
25c80 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
25c90 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  t of.      ** th
25ca0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20  e current row.  
25cb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
25cc0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
25cd0 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 75  (v, j1);.      u
25ce0 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
25cf0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
25d00 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
25d10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25d20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
25d30 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
25d40 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
25d50 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69  "indicate data i
25d60 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  n accumulator"))
25d70 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;..      /* End 
25d80 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20  of the loop.    
25d90 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67    */.      if( g
25da0 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
25db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25dc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
25dd0 72 74 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e  rterNext, sAggIn
25de0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
25df0 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20  ddrTopOfLoop);. 
25e00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25e10 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
25e20 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
25e30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25e40 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
25e50 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b  addrSortingIdx);
25e60 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
25e70 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69  /* Output the fi
25e80 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  nal row of resul
25e90 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
25ea0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
25eb0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
25ec0 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
25ed0 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
25ee0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
25ef0 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61  (v, "output fina
25f00 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20  l row"));..     
25f10 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68   /* Jump over th
25f20 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20  e subroutines.  
25f30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
25f40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
25f50 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
25f60 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f  drEnd);..      /
25f70 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
25f80 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
25f90 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  puts a single ro
25fa0 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  w of the result.
25fb0 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54        ** set.  T
25fc0 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66  his subroutine f
25fd0 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68  irst looks at th
25fe0 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20  e iUseFlag.  If 
25ff0 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a  iUseFlag.      *
26000 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  * is less than o
26010 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c  r equal to zero,
26020 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
26030 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a  is a no-op.  If.
26040 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f        ** the pro
26050 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f  cessing calls fo
26060 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61  r the query to a
26070 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f  bort, this subro
26080 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  utine.      ** i
26090 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41  ncrements the iA
260a0 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20  bortFlag memory 
260b0 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20  location before 
260c0 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20  returning in.   
260d0 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73     ** order to s
260e0 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72  ignal the caller
260f0 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20   to abort..     
26100 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65   */.      addrSe
26110 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33  tAbort = sqlite3
26120 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
26130 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
26140 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
26150 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41  P_Integer, 1, iA
26160 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
26170 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
26180 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67   "set abort flag
26190 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
261a0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
261b0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
261c0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
261d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
261e0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f  veLabel(v, addrO
261f0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
26200 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
26210 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
26220 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
26230 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
26240 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
26250 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f   iUseFlag, addrO
26260 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20  utputRow+2);.   
26270 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
26280 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75  v, "Groupby resu
26290 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74  lt generator ent
262a0 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20  ry point"));.   
262b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
262c0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
262d0 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
262e0 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
262f0 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
26300 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
26310 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
26320 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
26330 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f  , pHaving, addrO
26340 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49  utputRow+1, SQLI
26350 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
26360 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
26370 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
26380 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30   p->pEList, 0, 0
26390 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  , pOrderBy,.    
263a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263b0 20 20 64 69 73 74 69 6e 63 74 2c 20 70 44 65 73    distinct, pDes
263c0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
263d0 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74           addrOut
263e0 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65  putRow+1, addrSe
263f0 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73  tAbort);.      s
26400 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
26410 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
26420 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
26430 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
26440 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79  (v, "end groupby
26450 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
26460 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
26470 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
26480 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
26490 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d  reset the group-
264a0 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20  by accumulator. 
264b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
264c0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
264d0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73  Label(v, addrRes
264e0 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  et);.      reset
264f0 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
26500 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
26510 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26520 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
26530 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b  turn, regReset);
26540 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20  .     .    } /* 
26550 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20  endif pGroupBy. 
26560 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65   Begin aggregate
26570 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74   queries without
26580 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20   GROUP BY: */.  
26590 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45    else {.      E
265a0 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20  xprList *pDel = 
265b0 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
265c0 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
265d0 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  T.      Table *p
265e0 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28  Tab;.      if( (
265f0 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43  pTab = isSimpleC
26600 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66  ount(p, &sAggInf
26610 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  o))!=0 ){.      
26620 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65    /* If isSimple
26630 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20  Count() returns 
26640 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54  a pointer to a T
26650 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  able structure, 
26660 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  then.        ** 
26670 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
26680 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
26690 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
266a0 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
266b0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
266c0 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  tbl>.        **.
266d0 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65          ** where
266e0 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
266f0 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72 65  ture returned re
26700 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c  presents table <
26710 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tbl>..        **
26720 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
26730 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f   statement is so
26740 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20   common that it 
26750 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65  is optimized spe
26760 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20  cially. The.    
26770 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20      ** OP_Count 
26780 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65  instruction is e
26790 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20 6f  xecuted either o
267a0 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62  n the intkey tab
267b0 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  le that.        
267c0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
267d0 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c  data for table <
267e0 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f  tbl> or on one o
267f0 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49  f its indexes. I
26800 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  t.        ** is 
26810 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75 74  better to execut
26820 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69  e the op on an i
26830 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73  ndex, as indexes
26840 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20   are almost.    
26850 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70      ** always sp
26860 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73  read across less
26870 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65 69   pages than thei
26880 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
26890 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20  tables..        
268a0 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  */.        const
268b0 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
268c0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
268d0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
268e0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
268f0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43      const int iC
26900 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  sr = pParse->nTa
26910 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73  b++;     /* Curs
26920 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65  or to scan b-tre
26930 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  e */.        Ind
26940 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
26950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26960 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
26970 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
26980 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
26990 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nfo = 0;        
269a0 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66         /* Keyinf
269b0 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e  o for scanned in
269c0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49  dex */.        I
269d0 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b  ndex *pBest = 0;
269e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269f0 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65      /* Best inde
26a00 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a  x found so far *
26a10 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
26a20 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  oot = pTab->tnum
26a30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
26a40 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73  * Root page of s
26a50 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f  canned b-tree */
26a60 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
26a70 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
26a80 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
26a90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
26aa0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
26ab0 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
26ac0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
26ad0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  );..        /* S
26ae0 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e  earch for the in
26af0 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68 65  dex that has the
26b00 20 6c 65 61 73 74 20 61 6d 6f 75 6e 74 20 6f 66   least amount of
26b10 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 0a 20 20 20   columns. If.   
26b20 20 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73       ** there is
26b30 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2c 20   such an index, 
26b40 61 6e 64 20 69 74 20 68 61 73 20 6c 65 73 73 20  and it has less 
26b50 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 20 74 68 65  columns than the
26b60 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 2a   table.        *
26b70 2a 20 64 6f 65 73 2c 20 74 68 65 6e 20 77 65 20  * does, then we 
26b80 63 61 6e 20 61 73 73 75 6d 65 20 74 68 61 74 20  can assume that 
26b90 69 74 20 63 6f 6e 73 75 6d 65 73 20 6c 65 73 73  it consumes less
26ba0 20 73 70 61 63 65 20 6f 6e 20 64 69 73 6b 20 61   space on disk a
26bb0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  nd.        ** wi
26bc0 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62 65 20  ll therefore be 
26bd0 63 68 65 61 70 65 72 20 74 6f 20 73 63 61 6e 20  cheaper to scan 
26be0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
26bf0 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 20   query result.. 
26c00 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69         ** In thi
26c10 73 20 63 61 73 65 20 73 65 74 20 69 52 6f 6f 74  s case set iRoot
26c20 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
26c30 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
26c40 69 6e 64 65 78 20 62 2d 74 72 65 65 0a 20 20 20  index b-tree.   
26c50 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 4b 65 79       ** and pKey
26c60 49 6e 66 6f 20 74 6f 20 74 68 65 20 4b 65 79 49  Info to the KeyI
26c70 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 72 65  nfo structure re
26c80 71 75 69 72 65 64 20 74 6f 20 6e 61 76 69 67 61  quired to naviga
26c90 74 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  te the.        *
26ca0 2a 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  * index..       
26cb0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28   **.        ** (
26cc0 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e  2011-04-15) Do n
26cd0 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61  ot do a full sca
26ce0 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65  n of an unordere
26cf0 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  d index..       
26d00 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
26d10 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b  n practice the K
26d20 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
26d30 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
26d40 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20  d. It is only . 
26d50 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64         ** passed
26d60 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e   to keep OP_Open
26d70 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20  Read happy..    
26d80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66      */.        f
26d90 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
26da0 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
26db0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
26dc0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
26dd0 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30  x->bUnordered==0
26de0 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70   && (!pBest || p
26df0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 42 65  Idx->nColumn<pBe
26e00 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 7b 0a  st->nColumn) ){.
26e10 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73              pBes
26e20 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  t = pIdx;.      
26e30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
26e40 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65 73          if( pBes
26e50 74 20 26 26 20 70 42 65 73 74 2d 3e 6e 43 6f 6c  t && pBest->nCol
26e60 75 6d 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  umn<pTab->nCol )
26e70 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f  {.          iRoo
26e80 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b  t = pBest->tnum;
26e90 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49  .          pKeyI
26ea0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  nfo = sqlite3Ind
26eb0 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65  exKeyinfo(pParse
26ec0 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20  , pBest);.      
26ed0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
26ee0 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Open a read-only
26ef0 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65   cursor, execute
26f00 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63   the OP_Count, c
26f10 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e  lose the cursor.
26f20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
26f30 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
26f40 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43   OP_OpenRead, iC
26f50 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 29 3b  sr, iRoot, iDb);
26f60 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65  .        if( pKe
26f70 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  yInfo ){.       
26f80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
26f90 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
26fa0 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  har *)pKeyInfo, 
26fb0 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
26fc0 46 46 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  FF);.        }. 
26fd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
26fe0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
26ff0 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67  ount, iCsr, sAgg
27000 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d  Info.aFunc[0].iM
27010 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
27020 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
27030 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72  , OP_Close, iCsr
27040 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61  );.        expla
27050 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50  inSimpleCount(pP
27060 61 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73  arse, pTab, pBes
27070 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  t);.      }else.
27080 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
27090 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
270a0 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   */.      {.    
270b0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
270c0 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20  the query is of 
270d0 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
270e0 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20  wing forms:.    
270f0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
27100 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78  *   SELECT min(x
27110 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
27120 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d     **   SELECT m
27130 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20  ax(x) FROM .... 
27140 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
27150 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74    ** If it is, t
27160 68 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65  hen ask the code
27170 20 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61   in where.c to a
27180 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72  ttempt to sort r
27190 65 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a  esults.        *
271a0 2a 20 61 73 20 69 66 20 74 68 65 72 65 20 77 61  * as if there wa
271b0 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78  s an "ORDER ON x
271c0 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78  " or "ORDER ON x
271d0 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a   DESC" clause. .
271e0 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68          ** If wh
271f0 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f  ere.c is able to
27200 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73   produce results
27210 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20   sorted in this 
27220 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20  order, then.    
27230 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20      ** add vdbe 
27240 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  code to break ou
27250 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73  t of the process
27260 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74  ing loop after t
27270 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  he .        ** f
27280 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28  irst iteration (
27290 73 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  since the first 
272a0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
272b0 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20   loop is .      
272c0 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
272d0 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
272e0 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d  e row with the m
272f0 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75  inimum or maximu
27300 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  m .        ** va
27310 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e  lue of x, the on
27320 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29  ly row required)
27330 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
27340 20 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61       ** A specia
27350 6c 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70  l flag must be p
27360 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
27370 57 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20  WhereBegin() to 
27380 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20  slightly.       
27390 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76   ** modify behav
273a0 69 6f 75 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  iour as follows:
273b0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
273c0 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68      **   + If th
273d0 65 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45  e query is a "SE
273e0 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68  LECT min(x)", th
273f0 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65  en the loop code
27400 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  d by.        ** 
27410 20 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75      where.c shou
27420 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f  ld not iterate o
27430 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77  ver any values w
27440 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ith a NULL value
27450 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
27460 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a  for x..        *
27470 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b  *.        **   +
27480 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63   The optimizer c
27490 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28  ode in where.c (
274a0 74 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64  the thing that d
274b0 65 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20  ecides which.   
274c0 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65       **     inde
274d0 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20  x or indices to 
274e0 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63  use) should plac
274f0 65 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72  e a different pr
27500 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20  iority on .     
27510 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66     **     satisf
27520 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20  ying the 'ORDER 
27530 42 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20  BY' clause than 
27540 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72  it does in other
27550 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20   cases..        
27560 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f 20  **     Refer to 
27570 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74  code and comment
27580 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72  s in where.c for
27590 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20   details..      
275a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70    */.        Exp
275b0 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d  rList *pMinMax =
275c0 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66   0;.        u8 f
275d0 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72  lag = minMaxQuer
275e0 79 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  y(p);.        if
275f0 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  ( flag ){.      
27600 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
27610 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e  rHasProperty(p->
27620 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
27630 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
27640 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ) );.          p
27650 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  MinMax = sqlite3
27660 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
27670 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
27680 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 30  pExpr->x.pList,0
27690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 65  );.          pDe
276a0 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20  l = pMinMax;.   
276b0 20 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d         if( pMinM
276c0 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  ax && !db->mallo
276d0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
276e0 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
276f0 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
27700 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44   flag!=WHERE_ORD
27710 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20  ERBY_MIN ?1:0;. 
27720 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d             pMinM
27730 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  ax->a[0].pExpr->
27740 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
27750 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27760 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
27770 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75   /* This case ru
27780 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67  ns if the aggreg
27790 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50  ate has no GROUP
277a0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65   BY clause.  The
277b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  .        ** proc
277c0 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73  essing is much s
277d0 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65  impler since the
277e0 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e  re is only a sin
277f0 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20  gle row.        
27800 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20  ** of output..  
27810 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
27820 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
27830 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
27840 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57  nfo);.        pW
27850 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
27860 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
27870 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
27880 65 2c 20 26 70 4d 69 6e 4d 61 78 2c 20 30 2c 20  e, &pMinMax, 0, 
27890 66 6c 61 67 29 3b 0a 20 20 20 20 20 20 20 20 69  flag);.        i
278a0 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a  f( pWInfo==0 ){.
278b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
278c0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
278d0 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20  db, pDel);.     
278e0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
278f0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
27900 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63          updateAc
27910 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
27920 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
27930 20 20 20 20 20 20 69 66 28 20 21 70 4d 69 6e 4d        if( !pMinM
27940 61 78 20 26 26 20 66 6c 61 67 20 29 7b 0a 20 20  ax && flag ){.  
27950 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
27960 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
27970 47 6f 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d  Goto, 0, pWInfo-
27980 3e 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20  >iBreak);.      
27990 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
279a0 28 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64  (v, "%s() by ind
279b0 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ex",.           
279c0 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52       (flag==WHER
279d0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d  E_ORDERBY_MIN?"m
279e0 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20  in":"max")));.  
279f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27a00 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
27a10 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
27a20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
27a30 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
27a40 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
27a50 7d 0a 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  }..      pOrderB
27a60 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  y = 0;.      sql
27a70 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
27a80 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
27a90 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45   addrEnd, SQLITE
27aa0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
27ab0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
27ac0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
27ad0 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  ->pEList, 0, 0, 
27ae0 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20  0, -1, .        
27af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
27b00 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64  est, addrEnd, ad
27b10 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71  drEnd);.      sq
27b20 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
27b30 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20  ete(db, pDel);. 
27b40 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
27b50 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
27b60 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  (v, addrEnd);.  
27b70 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20    .  } /* endif 
27b80 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
27b90 2a 2f 0a 0a 20 20 69 66 28 20 64 69 73 74 69 6e  */..  if( distin
27ba0 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 65 78 70  ct>=0 ){.    exp
27bb0 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
27bc0 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22  arse, "DISTINCT"
27bd0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
27be0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
27bf0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
27c00 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72  n we need to sor
27c10 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  t the results.  
27c20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d  ** and send them
27c30 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
27c40 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a   one by one..  *
27c50 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
27c60 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54   ){.    explainT
27c70 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
27c80 20 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20   "ORDER BY");.  
27c90 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
27ca0 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c  il(pParse, p, v,
27cb0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
27cc0 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  pDest);.  }..  /
27cd0 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
27ce0 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20  kip this query. 
27cf0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
27d00 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
27d10 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68   iEnd);..  /* Th
27d20 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63  e SELECT was suc
27d30 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e  cessfully coded.
27d40 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72     Set the retur
27d50 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a  n code to 0.  **
27d60 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20   to indicate no 
27d70 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72  errors..  */.  r
27d80 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  c = 0;..  /* Con
27d90 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65  trol jumps to he
27da0 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  re if an error i
27db0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62  s encountered ab
27dc0 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a  ove, or upon.  *
27dd0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64  * successful cod
27de0 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ing of the SELEC
27df0 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65  T..  */.select_e
27e00 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  nd:.  explainSet
27e10 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e  Integer(pParse->
27e20 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74  iSelectId, iRest
27e30 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20  oreSelectId);.. 
27e40 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c   /* Identify col
27e50 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73  umn names if res
27e60 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45  ults of the SELE
27e70 43 54 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74  CT are to be out
27e80 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  put..  */.  if( 
27e90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
27ea0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
27eb0 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
27ec0 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
27ed0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
27ee0 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
27ef0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62    }..  sqlite3Db
27f00 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66  Free(db, sAggInf
27f10 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  o.aCol);.  sqlit
27f20 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67  e3DbFree(db, sAg
27f30 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20  gInfo.aFunc);.  
27f40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
27f50 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
27f60 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50  _ENABLE_TREE_EXP
27f70 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  LAIN)./*.** Gene
27f80 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61  rate a human-rea
27f90 64 61 62 6c 65 20 64 65 73 63 72 69 70 74 69 6f  dable descriptio
27fa0 6e 20 6f 66 20 61 20 74 68 65 20 53 65 6c 65 63  n of a the Selec
27fb0 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  t object..*/.sta
27fc0 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
27fd0 4f 6e 65 53 65 6c 65 63 74 28 56 64 62 65 20 2a  OneSelect(Vdbe *
27fe0 70 56 64 62 65 2c 20 53 65 6c 65 63 74 20 2a 70  pVdbe, Select *p
27ff0 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  ){.  sqlite3Expl
28000 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
28010 20 22 53 45 4c 45 43 54 20 22 29 3b 0a 20 20 69   "SELECT ");.  i
28020 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
28030 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
28040 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20  _Aggregate) ){. 
28050 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61     if( p->selFla
28060 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
28070 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
28080 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
28090 56 64 62 65 2c 20 22 44 49 53 54 49 4e 43 54 20  Vdbe, "DISTINCT 
280a0 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
280b0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
280c0 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a  SF_Aggregate ){.
280d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
280e0 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
280f0 2c 20 22 61 67 67 5f 66 6c 61 67 20 22 29 3b 0a  , "agg_flag ");.
28100 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
28110 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
28120 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
28130 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
28140 65 2c 20 22 20 20 20 22 29 3b 0a 20 20 7d 0a 20  e, "   ");.  }. 
28150 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
28160 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70  xprList(pVdbe, p
28170 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c  ->pEList);.  sql
28180 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
28190 64 62 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  dbe);.  if( p->p
281a0 53 72 63 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e  Src && p->pSrc->
281b0 6e 53 72 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  nSrc ){.    int 
281c0 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  i;.    sqlite3Ex
281d0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
281e0 65 2c 20 22 46 52 4f 4d 20 22 29 3b 0a 20 20 20  e, "FROM ");.   
281f0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
28200 75 73 68 28 70 56 64 62 65 29 3b 0a 20 20 20 20  ush(pVdbe);.    
28210 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53  for(i=0; i<p->pS
28220 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  rc->nSrc; i++){.
28230 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
28240 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
28250 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69   = &p->pSrc->a[i
28260 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
28270 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
28280 64 62 65 2c 20 22 7b 25 64 2c 2a 7d 20 3d 20 22  dbe, "{%d,*} = "
28290 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
282a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
282b0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
282c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
282d0 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 56 64 62  plainSelect(pVdb
282e0 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
282f0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
28300 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20  pItem->pTab ){. 
28310 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
28320 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
28330 64 62 65 2c 20 22 20 28 74 61 62 6e 61 6d 65 3d  dbe, " (tabname=
28340 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  %s)", pItem->pTa
28350 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
28360 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
28370 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   if( pItem->zNam
28380 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
28390 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
283a0 66 28 70 56 64 62 65 2c 20 22 25 73 22 2c 20 70  f(pVdbe, "%s", p
283b0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
283c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
283d0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
283e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
283f0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
28400 64 62 65 2c 20 22 20 28 41 53 20 25 73 29 22 2c  dbe, " (AS %s)",
28410 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
28420 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
28430 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79  f( pItem->jointy
28440 70 65 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a  pe & JT_LEFT ){.
28450 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
28460 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
28470 62 65 2c 20 22 20 4c 45 46 54 2d 4a 4f 49 4e 22  be, " LEFT-JOIN"
28480 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
28490 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
284a0 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 7d 0a  L(pVdbe);.    }.
284b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
284c0 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 20 20  inPop(pVdbe);.  
284d0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  }.  if( p->pWher
284e0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
284f0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
28500 64 62 65 2c 20 22 57 48 45 52 45 20 22 29 3b 0a  dbe, "WHERE ");.
28510 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
28520 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d  inExpr(pVdbe, p-
28530 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71  >pWhere);.    sq
28540 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
28550 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Vdbe);.  }.  if(
28560 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a   p->pGroupBy ){.
28570 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
28580 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
28590 22 47 52 4f 55 50 42 59 20 22 29 3b 0a 20 20 20  "GROUPBY ");.   
285a0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
285b0 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70  xprList(pVdbe, p
285c0 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
285d0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
285e0 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20  L(pVdbe);.  }.  
285f0 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29  if( p->pHaving )
28600 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
28610 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
28620 2c 20 22 48 41 56 49 4e 47 20 22 29 3b 0a 20 20  , "HAVING ");.  
28630 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
28640 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70  Expr(pVdbe, p->p
28650 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c  Having);.    sql
28660 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
28670 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  dbe);.  }.  if( 
28680 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
28690 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
286a0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
286b0 4f 52 44 45 52 42 59 20 22 29 3b 0a 20 20 20 20  ORDERBY ");.    
286c0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
286d0 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d  prList(pVdbe, p-
286e0 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
286f0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
28700 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69  (pVdbe);.  }.  i
28710 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
28720 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
28730 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
28740 22 4c 49 4d 49 54 20 22 29 3b 0a 20 20 20 20 73  "LIMIT ");.    s
28750 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
28760 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 4c 69 6d  r(pVdbe, p->pLim
28770 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
28780 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
28790 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
287a0 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 73 71  Offset ){.    sq
287b0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
287c0 74 66 28 70 56 64 62 65 2c 20 22 4f 46 46 53 45  tf(pVdbe, "OFFSE
287d0 54 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  T ");.    sqlite
287e0 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64  3ExplainExpr(pVd
287f0 62 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  be, p->pOffset);
28800 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
28810 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
28820 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
28830 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 56 64  ExplainSelect(Vd
28840 62 65 20 2a 70 56 64 62 65 2c 20 53 65 6c 65 63  be *pVdbe, Selec
28850 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  t *p){.  if( p==
28860 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
28870 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
28880 64 62 65 2c 20 22 28 6e 75 6c 6c 2d 73 65 6c 65  dbe, "(null-sele
28890 63 74 29 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ct)");.    retur
288a0 6e 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  n;.  }.  while( 
288b0 70 2d 3e 70 50 72 69 6f 72 20 29 20 70 20 3d 20  p->pPrior ) p = 
288c0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 73 71 6c  p->pPrior;.  sql
288d0 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28  ite3ExplainPush(
288e0 70 56 64 62 65 29 3b 0a 20 20 77 68 69 6c 65 28  pVdbe);.  while(
288f0 20 70 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69   p ){.    explai
28900 6e 4f 6e 65 53 65 6c 65 63 74 28 70 56 64 62 65  nOneSelect(pVdbe
28910 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  , p);.    p = p-
28920 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
28930 70 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  p==0 ) break;.  
28940 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
28950 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73  NL(pVdbe);.    s
28960 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
28970 6e 74 66 28 70 56 64 62 65 2c 20 22 25 73 5c 6e  ntf(pVdbe, "%s\n
28980 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
28990 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 20 20 73  p->op));.  }.  s
289a0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
289b0 6e 74 66 28 70 56 64 62 65 2c 20 22 45 4e 44 22  ntf(pVdbe, "END"
289c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  );.  sqlite3Expl
289d0 61 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 7d  ainPop(pVdbe);.}
289e0 0a 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  ../* End of the 
289f0 73 74 72 75 63 74 75 72 65 20 64 65 62 75 67 20  structure debug 
28a00 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a  printing code.**
28a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e  ***********/.#en
28a60 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
28a70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45  QLITE_ENABLE_TRE
28a80 45 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a        E_EXPLAIN) */.